如何判断一个对象为数组

本文介绍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字符串,取第一个字符判断是不是[,如图所示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值