Javascript 为什么jQuery';s$。是否将每个数字转换为对象?
jQuery的每个函数在数组元素的上下文中执行回调函数:Javascript 为什么jQuery';s$。是否将每个数字转换为对象?,javascript,jquery,Javascript,Jquery,jQuery的每个函数在数组元素的上下文中执行回调函数: $.each([3], function () { console.log(this === 3); console.log(this.valueOf() === 3); }); 我期望true,但得到了false-true。这表示数组的元素被each函数装箱 我的问题分为两部分: 这个数字背后的动机是什么 是否可以编写一个新的each函数,使其按预期工作 1)来自: $.each()函数可用于迭代任何集合, 无论是对
$.each([3], function () {
console.log(this === 3);
console.log(this.valueOf() === 3);
});
我期望true
,但得到了false-true
。这表示数组的元素被each函数装箱
我的问题分为两部分:
- 这个数字背后的动机是什么
- 是否可以编写一个新的each函数,使其按预期工作
$.each([3], function (key, value) {
console.log(value === 3);
});
我的猜测是,当使用
.call()
调用$.each()
回调时,3
作为第一个参数传递,因此javascript总是将3
装箱到对象中,因为这个指针总是被认为是一个对象
Oleg观察到的一个有趣的现象是,在严格模式下,您得到true
和true
作为输出。请参见演示:
再次感谢Oleg,它描述了它没有在严格模式下装箱到对象中
并且,它包含以下步骤:“否则如果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);
});
或者,如果您仅尝试支持支持严格模式的浏览器,则可以对原始代码使用严格模式。
- 这个数字背后的动机是什么
因为第一个参数需要是数组:
我想在的“使用严格”下添加这一点代码>它返回的是数字本身。@Oleg-有趣的观察结果(我用一个演示添加到我的答案中)。你知道为什么吗?尽管如此(在注释中),它说“thisArg值作为this值在未经修改的情况下传递”。那么,浏览器只是没有这样做,还是我错过了其他一些process@PatrickEvans它发生在:“如果函数代码是严格代码,则将ThisBinding设置为thisArg……否则如果Type(thisArg)不是Object,则将ThisBinding设置为ToObject(thisArg)。”调用,应用,而bind
恰好是获取非对象this
的唯一方法。@freakish No他们没有--15.4.3.3说call
将其thisArg
传递给内部[[call]]
方法,而不修改它。不修改此
的。这两个部分在函数执行的不同阶段运行;他们之间没有矛盾,谢谢!这是一个实用的解决方案,但我想知道是否有任何方法可以在不更改回调函数定义的情况下重写每个函数,你不能重写你的函数来处理条件this==3。装箱一个数字是数组的javascript语法,只有一个元素。是的,我同意这一点。