判断javascript对象是否为数组

instanceof

MDN解释:instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
这句话的意思就是instanceof的原理其实是检查构造函数的原型是否在目标的原型链上。

请看如下代码

function Person() {
    this.name = 'zhangsan'
}
Person.prototype = Array.prototype
console.log(new Person() instanceof Array ) //true

我们都知道原型链的继承是一种不稳定的继承,实际上在《你不知道的javascript》中把这种prototype的关系称作关联,把公共函数定义在原型对象上,子对象调用原型对象的行为称为托管
所以instanceof会导致两个问题

  1. 如果定义了一个对象仅仅是它的构造函数设定为Array.ptototype, 这个构造函数派生的所有对象都会被instaceof关键字判定为数组

  2. 当存在多个global的时候,如当前页面存在frame,如果从frame中传出一个数组,然而由于两个global的Array.prototype是不同的,这个从frame传出的数组就会判定为不是数组,但是实际上它是一个数组

Object.prototype.toString

可以以

Object.prototype.toString.call(arg) === '[object Array]'

的方式来判定是否为数组,并不会因为prototype的设置而判定错误

实际上在mdn上给出的不存在Array.isArray的环境的polyfill就是

if (!Array.isArray) {
  Array.isArray = function(arg) {
    return Object.prototype.toString.call(arg) === '[object Array]';
  };
}

Array.isArray

严格判断javascript对象是否为数组
参考
MDN

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值