typeof 操作符
可以判断number,string,undefined,boolean,function,object,symbol七种类型。不能判定Array。
实现原理:通过变量的机器码的低1-3为判断
问题:
- 由于null的机器码为全零,object的机器码低三位也是0,所以会把null判定为object
- 对于object类型,只能判定为object,不能判断为具体是哪种object
- Array只能判定为object
instanceof
用于判断一个实例A是否属于某个类型B
原理:查找实例A的原型链(即隐式原型__proto__),如果B的原型对象(即prototype)出现在了实例的原型链上就返回true。如果一直找到Object.prototype.proto (其值为null)也没有找到B.prototype就返回false
问题:判断数组时,A和B需在同一全局作用域,如果页面中存在多个框架,那么在一个框架中判断另一个框架的数组是不是instanceof Array时会返回false,因为Array是window的属性
Object.prototype.toString.call()
解决了全局作用域的问题,可以判定Number,Array,nudefined,null,Function,RegExp,String
但是只能判定原生的构造函数,如 对于自定义的构造函数,只能返回[object object]