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 的一个有趣观察是,在严格模式下,您会得到 true
和 true
作为输出。参见演示: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/