javascript - 为什么 jQuery 的 $.each 将数字转换为对象?

标签 javascript jquery

jQuery 的 each 函数在数组元素的上下文中执行回调函数:

$.each([3], function () {
    console.log(this === 3);
    console.log(this.valueOf() === 3);
});

我期望 true true,但得到了 false true。这表示数组的元素被每个函数装箱。

我的问题分为两部分:

  • 装箱数字背后的动机是什么?
  • 能否编写一个新的 each 函数来按我的预期工作?

最佳答案

我的猜测是,当使用 .call() 调用 $.each() 回调时,3 作为第一个参数是 this 指针,javascript 总是将 3 装箱到一个对象中,因为 this 指针总是应该是一个对象。

Oleg 的一个有趣观察是,在严格模式下,您会得到 truetrue 作为输出。参见演示:http://jsfiddle.net/jfriend00/hjpQG/

再次感谢 Oleg,here's a reference描述它在严格模式下没有装箱到对象中。

并且,an ECMAScript reference from apsillers包含此步骤:“如果 Type(thisArg) 不是 Object,则将 ThisBinding 设置为 ToObject(thisArg)”。这一步在 JS 引擎内部发生在以任何方式调用函数的过程中(当不在严格模式下时)。


要在所有浏览器中解决这个问题,您可以将 === 更改为 == 或者您可以切换到使用传递给回调的第二个参数这是未受干扰的值。

$.each([3], function (index, value) {
    // use value argument
    log(value === 3);
    log(this.valueOf() === 3);
});

$.each([3], function (index, value) {
    // double equals
    log(this == 3);
    log(this.valueOf() === 3);
});

或者,如果您只想支持支持严格模式的浏览器,则可以在原始代码中使用严格模式。

关于javascript - 为什么 jQuery 的 $.each 将数字转换为对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24720237/

相关文章:

javascript - 是否有任何基于 HTML Canvas 构建的 GUI 工具包,如 swing、swt、gtk 或 qt?

javascript - 根据当前 URL 中的字符串修改源

javascript - 具有两个固定导航的 anchor 链接 - 复杂

jquery - 悬停时的动画圆形条

javascript - 使用 jquery 反转名字和姓氏

javascript - 如何将字符串转换为数字?

javascript - React bootstrap onclick list-group-item 突出显示该项目/事件

javascript - 如何最小化触摸移动的主线程等待

javascript - 从表中删除多选行

javascript - jquery代码中e的用途和含义是什么