instanceof
MDN解释:instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
这句话的意思就是instanceof的原理其实是检查构造函数的原型是否在目标的原型链上。
请看如下代码
function Person() {
this.name = 'zhangsan'
}
Person.prototype = Array.prototype
console.log(new Person() instanceof Array ) //true
我们都知道原型链的继承是一种不稳定的继承,实际上在《你不知道的javascript》中把这种prototype的关系称作关联,把公共函数定义在原型对象上,子对象调用原型对象的行为称为托管
所以instanceof会导致两个问题
-
如果定义了一个对象仅仅是它的构造函数设定为Array.ptototype, 这个构造函数派生的所有对象都会被instaceof关键字判定为数组
-
当存在多个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