JavaScript中关于数组的断定问题,一直都是一个必需要掌握的点,那么,运用知识,如何判断一个类型是数组,就须要有对JavaScript使用有着深刻的了解。javascript
ES5新增的数组方法,Array.isArray应该是咱们最早想到的断定方式,如今应用的也比较普遍。java
const arr = [1,2,3,4] Array.isArray(arr) // true
若是是在支持ES5的浏览器中,用这样的方式天然没什么问题,可是若是是在IE9如下版本,这个方法并未受到支持,这时候咱们就要用别的方式来判断数组。数组
通常来讲,instanceof关键字,是用来判断某个元素是否某对象构造函数实例。在数组判断上,instanceof关键字也能够进行数组的断定。浏览器
const arr = [1, 2, 3, 4] arr instanceof Array // true
instanceof支持的浏览器版本比较多,因此通常来讲,用instanceof判断,会比Array.isArray断定的范围要普遍。app
对象的toString方式也能够断定数组类型,通常来讲这种方式的断定是各大库的一种Array.isArray的代替实现。ide
例如,polyfill中,就是如此实现:函数
if (!Array.isArray) { Array.isArray = function(arg) { return Object.prototype.toString.call(arg) === '[object Array]'; }; } const arr = [1, 2, 3, 4] Object.prototype.toString.call(arr) === '[Object Array]' // true
除了以上的方式以外,咱们还能够经过构造函数来断定:prototype
const arr = [1, 2, 3, 4] arr.constructor === Array // true arr.__proto__.constructor === Array //true
instanceof和constructor的断定也存在一些弊端,他们断定的数组必须定义在同一个页面,不然将会断定为false。对象
若是在iframe中的数组断定,就会出错。blog
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 through iframes arr instanceof Array; // false arr.constructor === Array; // false
由上述几个方法断定,能够得出,其实polyfill的断定是最合理的,也最具备兼容性的一种断定。
利用toString断定,胜出。