typeof和instance of都存在局限性问题
如:
typeof
typeof null //object
typeof NaN //number
var foo = function(){}
typeof foo = function
typeof [] //object
typeof {} //object
它只能用来判断一些简单的类型,无法判断内置具体类型,这边会有一些局限问题
instance of
[] instance of Object //true
[] instance of Array //true (因为Array是Object下的子类)
let regExp = /\d/
regExp instance of RegExp // true
regExp instance if Object // true
判断一些内置类型还是挺方便的,但是因为都是Object下的子类,所以可以判断是Object类型,如果判断一个对象的话,可能就会存在一些问题;
此外就是通过frame引入不同的页面时,会存在顶层对象指定问题,所以总的来说,instance of 也是问题多多;
最值得推荐使用的是Object.prototype.toString.call()
原生函数构建的各个类中都会存在[[Class]]属性,我们可以通过Object.prototype.toString.call()进行访问;
还是上代码体会以下它的强大之处吧
Object.prototype.toString.call("str") //"[object String]"
Object.prototype.toString.call(123) //"[object Number]"
Object.prototype.toString.call([1,2,3])
//"[object Array]"
Object.prototype.toString.call({a:3})
//"[object Object]"
Object.prototype.toString.call(NaN) //"[object Number]"
Object.prototype.toString.call(null) //"[object Null]"
Object.prototype.toString.call(true) //"[object Boolean]"
let sym = Symbol()
Object.prototype.toString.call(sym) //"[object Symbol]"
体会到强大的地方了吧?基本上每个类型都可以判断,就是NaN始终是个问题,但是相对于其他两个来说已经很棒了
NaN判断可以通过顶层对象window.isNaN()来进行判断是否是NaN;