数据类型检测方式
typeof
console.log(typeof true) // Boolean
console.log(typeof 2) //number
console.log(typeof 'abd') //string
console.log(typeof []) //object
console.log(typeof null) //object
console.log(typeof undefined) //undefined
数组 对象 null 通过这种方式检测 返回的结果都是Object 这不是我们想要的结果
instanceof
可以正确的判断对象的类型,其内部运行机制是判断在其原型链中能否找到该类型的原型。
底层原理如下:
function instance_of(L,R){
var O = R.prototype;
var L = L._proto_;
while(true){
if(O==null) return false;
if(O==L) return true //L的隐式原型能在O的显式原型中找到
}
}
console.log(instance_of([],Array))
左边L表示对象,右边R表示数据类型,判断依据就是:L的隐式原型能不能在O的原型上找到。
console.log(2 instanceof Number) //false
console.log('abc' instanceof String) //false
console.log([] instanceof Arrary) //true
console.log(function(){} instanceof Function); // true
console.log({} instanceof Object); // true
instanceof不能用于检测基本数据类型,只能判断引用数据类型
容易混淆的是:
indexof 是用来检测数组元素的索引号的,返回结果就是该元素的索引号,如果没有该元素,就返回-1
constructor
constructor 有两个作用,一是判断数据类型,而是对象实例通过它可找到它的构造函数
console.log((2) constructor == Number) //true
console.log(([]) constructor == Array) //true
Object.prototype.toString()
注意Object原型上的toString方法是用来判断数据类型的,而Object的实例对象 (自定义构造函数或者内置构造函数)在继承Object属性和方法时,toString()方法是被重写了的,也就是实例对象身上都能找到两个toString方法,一个是它的原型上的toString(),用来精准判断数据类型的,另一个toString就是自己身上被重写之后的方法,用于转化为字符串。
判断时,使用call来调用
Object.prototype.toString.call(检测对象) ----- 括号里的对象去调用这个方法
Object.prototype.toString.call(2) //[object Number]