别看这个问题看似简单,面试真的经常问到,没有总结过得话一时间还有点想不起来!
一、instanceof
instanceof只适用于对象类型的数据,基本类型会直接返回false,其实现原理是在原型链上查找某属性。
let arr = [1, 2, 3];
let a = arr instanceof Array;
console.log(a); // true
注:这个方法是假定只有一个全局执行环境,如果网页中包含多个框架,那就会存在两个以上不同版本的Array构造函数。
二、ES6中的isArray方法
let arr = [1, 2, 3];
console.log(Array.isArray(arr)); // true
注:这个方法是ES6语法中新增的,目前支持的浏览器有IE 9+,Firefox 4+,Safari 5+,Opera 10.5+ 和 Chrome。
三、__proto__和prototype
let arr = [1, 2, 3];
console.log(arr.__proto__ === Array.prototype); //true
四、constructor
let arr = [1, 2, 3];
console.log(arr.__proto__.constructor === Array); //true
五、toString方法
let arr = [1, 2, 3]
console.log(Object.prototype.toString.call(arr)); // [object Array]
六、Array 原型链上的 isPrototypeOf
检验Array/Object/Number...是否在arr的原型链上
let arr = [1,2,3];
console.log(Array.prototype.isPrototypeOf(arr)); // true
console.log(Object.prototype.isPrototypeOf(arr)); // true
console.log(Number.prototype.isPrototypeOf(arr)); // false
七、Object.getPrototypeOf
该方法会返回指定对象的原型
let arr = [1,2,3];
let b = {};
console.log(Object.getPrototypeOf(arr) === Array.prototype); // true
console.log(Object.getPrototypeOf(arr) === Object.prototype); // false
console.log(Object.getPrototypeOf(arr) === Function.prototype); // false
console.log(Object.getPrototypeOf(b) === Array.prototype); // false
console.log(Object.getPrototypeOf(b) === Object.prototype); // true