- typeof会返回一个运算数的基本类型,instanceof 返回的是布尔值
- instanceof 可以准确判断引用数据类型,但是不能正确判断原始数据类型
- typeof虽然可以判断原始数据类型(null 除外),但是无法判断引用数据类型(function 除外)
instanceof 检测数据类型的原理: 顺着原型链去找,直到找到相同的原型对象,返回true,否则为false
完美的检测数据类型的话,推荐使用Object.prototype.toString.call()方法
Object.prototype.toString.call({})
Object.prototype.toString.call([])
Object.prototype.toString.call(666)
Object.prototype.toString.call(true)
Object.prototype.toString.call(null)
Object.prototype.toString.call(undefined)
要想搞明白这个知识点,在这里你必须要对原型链和原型有清晰的认识。我们知道,JS的大原型其实是Object
构造函数的prototype
指向的那个Object
,JS的世界的来源就是它。
这个对象上的toString
方法才是原汁原味的toString
。
当我们用delete
方法去删除Function.prototype
(也就是Function
构造函数的原型)身上的toString
,然后我们再次调用name.toString
会发生什么呢?
但是我们往往不会用delete
去删除,所以就采用call
方法去改变Object.prototype.toString
方法this
的指向。