判断变量类型
1.typeof:
对于原始类型来说,除了null都会显示正确的类型
对于对象来说,除了函数都会显示object,所以说typeof并不能准确判断变量到底是什么类型
最好是只用typeof来判断基本数据类型(包括symbol),避免对null的判断
2.instanceof可以准确的判断一个对象的正确类型,因为其内部机制是通过原型链来判断的
但是 instanceof 也可能判断不准确,比如一个数组,他可以被 instanceof 判断为 Object。
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__
}
}
instanceof 主要的实现原理就是只要右边变量的 prototype 在左边变量的原型链上即可。
因此,instanceof 在查找的过程中会遍历左边变量的原型链,直到找到右边变量的 prototype,如果查找失败,则会返回 false,告诉我们左边变量并非是右边变量的实例。
3.还有一种方法是用 Object.prototype.toString.call() 可以对一个变量类型进行比较准确的判断
Object.prototype.toString.call({a:'hi'}) // [object Object]
Object.prototype.toString.call([1,'a']) // [object Array]
Object.prototype.toString.call(() => {}) // [object Function]
Object.prototype.toString.call(null) // [object null]
总结:
typeof null // 'Object'
判断数组的方法:使用 Object.prototype.toString.call(数组)
判断空对象的方法: 使用instanceof
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。