Javascript 为什么jQuery';s$。是否将每个数字转换为对象?

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()函数可用于迭代任何集合, 无论是对

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

$.each([3], function () {
    console.log(this === 3);
    console.log(this.valueOf() === 3);
});
我期望
true
,但得到了
false-true
。这表示数组的元素被each函数装箱

我的问题分为两部分:

  • 这个数字背后的动机是什么
  • 是否可以编写一个新的each函数,使其按预期工作
1)来自:

$.each()函数可用于迭代任何集合, 无论是对象还是数组。在数组的情况下 回调函数被传递一个数组索引和相应的数组值 时间(也可以通过this关键字访问该值,但是 Javascript将始终将该值包装为对象,即使它是 一个简单的字符串或数值。)

这在JavaScript中始终是一个对象

2) 您可以像这样重写代码:

$.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语法,只有一个元素。是的,我同意这一点。