Difference between using Array.isArray and instanceof Array
有两种方法可以确定数组是数组还是对象。对于一个对象和一个数组,使用
解决方案1:
1 | Array.isArray(item); |
解决方案2:
1 | item instanceof Array; |
我的问题是:
1.What is the difference between these two solutions?
is array是一个ES5方法,因此旧浏览器不支持它,但它可以可靠地确定对象是否是数组。
instanceof仅检查array.prototype是否在对象的
2.Which of these two is the preferred solution?
"首选"假设一些选择标准。通常,首选方法如下:
1 | if (Object.prototype.toString.call(obj) == '[object Array]') |
它适合ES3浏览器并跨帧工作。如果只考虑ES5浏览器,isarray可能是正常的。
3.Which has a faster process time?
基本上不相关,因为两者的处理时间可以忽略不计。更重要的是选择一个可靠的。可以将array.isarray方法添加到没有内置该方法的浏览器中—使用:
1 2 3 4 5 | if (!Array.isArray) { Array.isArray = function(obj) { return Object.prototype.toString.call(obj) == '[object Array]'; } } |
正如FelixKling在评论中提到的,
1 2 3 4 5 6 7 8 9 10 11 12 | var iframeEl = document.createElement('iframe'); document.body.appendChild(iframeEl); iframeArray = window.frames[window.frames.length - 1].Array; var array1 = new Array(1,1,1,1); var array2 = new iframeArray(1,1,1,1); console.log(array1 instanceof Array); // true console.log(Array.isArray(array1)); // true console.log(array2 instanceof Array); // false console.log(Array.isArray(array2)); // true |
如上例所示,使用iframe中的数组构造函数(即
如果你想知道为什么
这两个方案中哪一个是首选方案?
在大多数情况下,
不过,一定要检查浏览器的兼容性。如果您需要支持IE8或更低版本,
哪个处理时间更快?
根据这个JSperf,