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

时间:2014-07-13 06:47:43

标签: javascript jquery

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

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

我期待true true,但得到false true。这表示阵列的元素被每个函数装箱。

我的问题分为两部分:

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

3 个答案:

答案 0 :(得分:5)

1)来自jQuery.each docs

  

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

始终是JavaScript中的对象。

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

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

JSFiddle

答案 1 :(得分:5)

我的猜测是,当使用$.each()调用.call()回调并且3作为第一个参数传递时,它将成为javascript始终将{ {1}}到一个对象,因为3指针始终应该是一个对象。

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

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

并且an ECMAScript reference from apsillers包含此步骤:true。这个步骤在JS引擎内部以任何方式调用函数的过程中发生(当不在严格模式下时)。


要在所有浏览器中解决此问题,您可以将"Else if Type(thisArg) is not Object, set the ThisBinding to ToObject(thisArg)"更改为===,也可以切换为使用传递给回调的第二个参数,这是未受干扰的值。

==

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

答案 2 :(得分:-6)

  • 这个数字背后的动机是什么?

因为第一个参数需要是一个数组:

http://api.jquery.com/jquery.each/