1.Object.prototype.toString.call()
Object.prototype.toString.call(任意类型的值),返回一个字符串 '[object 类型]',这种方法对所有数据类型都能判断,即使是null或者undefined;
Object.prototype.toString.call('An') // "[object String]"
Object.prototype.toString.call(1) // "[object Number]"
Object.prototype.toString.call(Symbol(1)) // "[object Symbol]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call(function(){}) // "[object Function]"
Object.prototype.toString.call({name: 'An'}) // "[object Object]"
instanceof
instanceof的内部机制是判断目标对象的原型链是不是能找到prototype.
使用instanceof判断一个对象是不是数组,instanceof会判断这个对象的原型链上有没有数组的原型,找到就返回true,否则返回false
[] instanceof Array //true
var x={}
x instanceof Array //false
x.__proto__=Array.prototype
x instanceof Array //true
instanceof 算法机制
function instance_of(L,R){
var O=R.prototype;
L=L.__proto__;
while(true){
if(L===null){
return false;
}
if(O===L){
return true;
}
L=L.__proto__;
}
}
3.Array.isArray()
- 功能主要是判读是否是数组
Array.isArray()与Object.prototype.toString.call()
Array.isArray()是es6新增的语法,当不存在Array.isArray()方法时,可以用Object.prototype.toString.call()实现,Array.isArray()的polyfill 通常如下
if(!Array.isArray){
Array.isArray=function(arr){
return Object.prototype.toString.call(arr)==='[object Array]';
}
}