3
$.each(["foo","bar"],function(){console.debug(this);});

将字符串类型的“foo”和“bar”转换为它们在字符串对象中的等价物。

然而...

$.each(["foo","bar"],function(i,e){console.debug(e);});

将 "foo" 和 "bar" 保留其原始字符串类型。

我想知道为什么 $.each 进行转换?而且,更重要的是......这种转换永远不会发生 - 让字符串保持原样,无论它们是字符串类型还是字符串对象?

4

2 回答 2

2

根据jQuery 文档

(该值也可以通过 this 关键字访问,但 Javascript 将始终将 this 值包装为一个对象,即使它是一个简单的字符串或数字值。)

这表明进行转换的是 Javascript,而不是 jQuery。

在使用回调函数中的值的情况下,jQuery 自己传递该值,因此它可以保留其类型。

于 2012-05-03T14:24:01.117 回答
1

jQuery 在这里不应该受到责备:它是 JavaScript 的一个怪癖。正如 ECMAScript 第三版第 10.4.3 节中所定义的,当你调用一个函数时,this伪参数被操纵:特别是,一个空值被转换为全局对象(window),并且原始值被自动装箱:

3) 否则,如果 Type(thisArg) 不是 Object,则将 ThisBinding 设置为 ToObject(thisArg)。

参数不会以同样的方式被破坏,这就是为什么 each() 的第二个参数更可靠的原因。

JavaScript 这样做并没有特别的理由,这只是 Netscape 在当时所做的疯狂事情之一,然后必须在 ECMAScript 中进行标准化。在第五版的严格模式中,这种奇怪的行为消失了。

于 2012-05-03T15:31:39.667 回答