IE中的$ .isPlainObject($('...'))== true

Mas*_*ity 4 jquery internet-explorer

它不在FF/Chrome中,我认为它不应该在IE中.毕竟$()不返回普通对象,而是返回$的实例.我错了吗?

Nic*_*ver 6

简答: 不,你不是疯了,它确实是jQuery核心中的一个bug.


答案很长:

我设置了一个快速测试,看看有什么区别:http://jsfiddle.net/nick_craver/9J3VP/

属性列表在IE中的顺序不同(至少8个),所以这部分(来自jQuery核心):

var key;
for ( key in obj ) { }
Run Code Online (Sandbox Code Playgroud)

它抓住列表中的最后一个属性并对其进行hasOwnProperty检查,所以它在IE中沸腾到这个:

Object.prototype.hasOwnProperty.call($(document.body), 'length') //true
Run Code Online (Sandbox Code Playgroud)

这在其他浏览器中(经过测试的FF/Chrome):

Object.prototype.hasOwnProperty.call($(document.body), 'width') //false
Run Code Online (Sandbox Code Playgroud)

由于该属性列表进行排序不同,它抓住了length在IE属性,以及一些其他在其他浏览器,我们得到一个不同的结果(踢,单击以包括左边的jQuery UI,看着它更改为其他自定义属性,tabs). 循环上方的这条评论for:

// Own properties are enumerated firstly, so to speed up,
// if last one is own, then all properties are own.
Run Code Online (Sandbox Code Playgroud)

关于IE的属性排序是一个错误的假设,所以我认为这是jQuery 1.4.2的一个错误.