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

Rya*_*yan 3 javascript jquery

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

$.each([3], function () {
    console.log(this === 3);
    console.log(this.valueOf() === 3);
});
Run Code Online (Sandbox Code Playgroud)

我期待true true,但得到了false true.这表示数组的元素由每个函数加框.

我的问题有两个部分:

  • 拳击数量背后的动机是什么?
  • 可以按照我的预期编写新的每个函数吗?

And*_*ius 5

1)来自jQuery.each文档:

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

始终是JavaScript中的一个对象.

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

$.each([3], function (key, value) {
    console.log(value === 3);
});
Run Code Online (Sandbox Code Playgroud)

的jsfiddle


jfr*_*d00 5

我的猜测是,当$.each()回调被调用时.call(),它3被作为第一个参数传递,因此它将成为这个指针,javascript总是将其3存入一个对象,因为this指针始终应该是一个对象.

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

再次感谢Oleg,这里有一个引用,它描述了它没有在严格模式下装入对象.

并且,包含此步骤的apsillers的ECMAScript参考:"Else if Type(thisArg) is not Object, set the ThisBinding to 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);
});
Run Code Online (Sandbox Code Playgroud)

或者,如果您只是尝试支持支持严格模式的浏览器,则可以对原始代码使用严格模式.