var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
xArray = window.frames[window.frames.length-1].Array;
var arr = new xArray(1,2,3); // [1,2,3]
// Correctly checking for Array
Array.isArray(arr); // true
// Considered harmful, because doesn't work though iframes
arr instanceof Array; // false
原理:
Object.prototype.toString.call() 是借用Object.prototype上的toString方法,该方法在内部访问[Symbol.toStringTag]属性,默认返回值是[object Type],其中type是内置对象的类型,使用这种方法可以判断所有js内置对象的类型
instanceof 是判断对象的原型链上是否包含指定对象的原型(prototype) 但对象的原型是可以修改的
Array.isArray() es5中新增的方法,专门用来判断对象是否为数组。
Array.isArray与Object.prototype.toString.call:
当不支持Array.isArray时可以用Object.prototype.toString.call()来polyfill
Array.isArray与 instanceof
MDN文档上说:
同时还举了例子
我写了个例子测试一下:
frame1.html的代码
index.html的代码
可以看到
f1.window.array instanceof Array)
返回的是false,就是因为当前有两个全局执行环境,也就是有两个Array构造函数所以遇到iframe这种情况可以使用下面的方法,更方便的是直接使用Array.isArray()
性能: 测试性能 测试几次都是 Array.isArray > instanceof > Object.prototype.toString.call