typeof
- 直接在计算机底层基于数据类型的值(二进制)进行检测的。
- typeof null 为 “object” 是因为对象存储在计算机中都是以000开始的二进制存储的,null是全0,所以检测出来的结果是对象。
- typeof 普通对象/数组/正则对象/日期对象 都是“object”
instanceof「检测当前实例是否属于这个类 」
检测当前实例是否属于这个类。
- 可以用来检测对象类型。
- 底层机制:只要当前类出现在实例的原形链上,结果都为true。
存在的问题:
- 由于可以肆意修改原形的指向,所以检测出来的结果是不准的。
- 不可以检测基础类型!!
手写instanceof
function instance_of(example,classFunc){
let classPrototype = classFunc.prototype
// 为了适配ie ,因为ie不支持example.__proto__这种写法
proto = Object.getPrototypeOf(example);// 相当于 example.__proto__
while(true){
// 找到了Object.__proto__
if(proto===null) return false;
if(proto===classPrototype){
// 查找过程中找到了,则证明实例是这个类的一个实例
return true;
}
// 继续往上找
proto = Object.getPrototypeOf(proto)
}
}
constructor
constructor 类的构造函数,
- 可以检验基本类型、对象!!
- 但是 constructor 可以随便改,所以也不准!!
Object.prototype.toString.call([val])
标准检测数据类型的方法!!!
原理:Object.prototype.toString 不是用来转换为字符串,而是返回当前实例所属类的信息的!!
如:
let obj={
name:'111'
}
// alert 就会调用obj.toString
alert(obj) // [object Object]
// obj.toString() ==>[object Object]
// + 上面的this 是obj,所以检测的是obj它的所属类信息
全都可以检测!!Object.prototype.toString 是标准检测的方法!!
封装万能的检测方法
可以用typeof+object.prototype.toString.call()
进行封装