本文介绍3种方法去判断一个对象是否为数组。
01
使用Object.prototype.toString.call(),这个方法会返回一个字符串,我们可以用返回结果和[object Aarray]进行比较,判断对象是否为一个数组。
该方法存在一个缺陷,ES6标准中,对象增加了一个Symbol.toStringTag属性,这可以使我们自定义该方法返回值,从而得到与预期不符的结果。
在日常使用中,不会去自定义该属性值,但在大框架或者组件开发中必须考虑全面,这会使得缺陷被放大。
02
使用instanceof原型链,同理会得到一个返回值,根据值去判断该对象是否为数组。
同样的,如果我们人为去设置一个对象的原型为数组,那么也会得到相同的结果。
如果通过人为方式去定义该对象为数组,即我们认定这个对象的原型链上有Array的原型就是一个数组,那么得到的结果没什么问题。但从数组的定义出发,即数组是一种特殊的存储结构,它的空间结构是连续的,对数组进行修改时,时间复杂度为O(1),这种情况下得到的结果是不对的。
同时,如果页面上存在iframe框架页的话,那么会有新的问题,上面代码中的Array是全局对象,使用window.Array构造函数得到的,在框架页中也存在一个Array,使用iframe.contentWindow.Array构造函数得到的,如果使用这个去创建一个新的数组,即使该对象是数组,但是也不会得到预期结果,因此,这种方法也不适用。
03
现在也是最准确的一种方法就是使用Array.isArray(),isArray()是使用c++去实现的,该方法会判断对象的数据结构,也就是有没有经过Array这个构造函数。
最后介绍一种有趣的方法,将对象转化成json字符串,取第一个字符判断是不是[,如图所示。