1 typeof
typeof 返回的数据类型 :Number、String、Boolean、Function、undefined、Object 六个
但是,只有在判断基本数据类型的时候,返回的是对应的类型值,当检测 null array object 以及函数的实例时,返回值都是object
2 instanceof
为解决typeof的缺陷,引出了 instanceof ,instanceof的实现原理就是 判断右侧的构造函数的prototype属性是否在左侧变量的原型链上,是的话就返回true,否则返回false
function new_instance_of(leftVaule, rightVaule) {
let rightProto = rightVaule.prototype; // 取右表达式的 prototype 值
leftVaule = leftVaule.__proto__; // 取左表达式的__proto__值
while (true) {
if (leftVaule === null) {
return false;
}
if (leftVaule === rightProto) {
return true;
}
leftVaule = leftVaule.__proto__
}
}
const arr =[1,2,3]
arr instanceof Array //true
arr instanceof Object //true
const obj={}
obj instanceof Object //true
问题:从上面的代码可以看出来,当使用instanceof判断数组时,是有问题的,出现这个问题是因为原型链
首先,我们来分析一下 [] Array Object三者直接的关系
1 []的__proto__指向的是它的构造函数Array的原型prototype ([].__proto__==Array.prototype)
2 然而Array的原型对象prototype的__proto__指向的是Object.prototype (Array.prototype.__proto__===Object.prototype) ,最后Object.prototype.__proto__ 指向了null,原型链结束。
3 从原型链看 []的__proto__最终指向了Object.prototype 因此 结果为true
总结: 使用instanceof也不能准确判断数组的类型
3 Object.prototype.toString的使用
可以使用Object.prototype.toString.call()来检测数据类型
4 constructor
可以使用constructor来判断数据类型
const arr=[1,2,3]
arr.constructor ==Array //true
const obj={}
obj.constructor ==Object//true
function f(){}
f.constructor==Function // true