Crockford 在Javascript 中提出了一个解决方案:The Good Parts用于识别对象是否是一个数组,如下所示:
var isArray = function (obj) {
return obj && typeof obj === "object" && obj.constructor === Array;
}
但他接着说
...它无法识别在不同窗口或框架中构造的数组...
为什么这个解决方案在这种情况下不起作用?
Crockford 在Javascript 中提出了一个解决方案:The Good Parts用于识别对象是否是一个数组,如下所示:
var isArray = function (obj) {
return obj && typeof obj === "object" && obj.constructor === Array;
}
但他接着说
...它无法识别在不同窗口或框架中构造的数组...
为什么这个解决方案在这种情况下不起作用?
符号“数组”是每个窗口本地的东西。检查以查看在不同窗口中构造的对象是否具有特定的本机构造函数因此不起作用。
即:在窗口#1 中,有一个“Array”构造函数。窗口#2 中也有一个。当然,它们是相同的,但它们是不同的,因为它们是不同的对象。进行比较时,它会以任何对象比较的方式进行:两个值要么是对完全相同的对象的引用,要么不是。
JavaScript 以这种方式工作有点奇怪,但这是语言的本质。
jQuery 执行 a toString.call(obj)
,如果结果为"[object Array]"
,则其isArray()
函数返回true
。
在其他情况下,当 jQuery 可能只是在寻找类似数组的对象(包括 DOM 集合)时,它只是检查是否存在.length
属性。这显然不是万无一失的,但它确实将它与普通对象或其他普通类型区分开来。