一.typeof
1.用来判断基本数据类型
null、Object、String判断的结果都为object
二.instanceof
检测构造函数的 prototype
属性是否在某个实例对象的原型链上
不能判断简单数据类型,只能判断复杂数据类型。
复杂数据类型的具体类型不一定判断正确。
手写instanceof
function myInstanceof(source, target) {
// 获取需要判断对象的原型
let proto = Object.getPrototypeOf(source);
// 获取构造函数的 prototype 对象
let prototype = target.prototype;
// 判断构造函数的 prototype 对象是否在对象的原型链上
while (true) {
if (!proto) return false; //尽头Object.prototype.__proto__ = null
if (proto === prototype) return true;
proto = Object.getPrototypeOf(proto);
}
}
三.constructor
与js代码的执行机制有关。在一个函数定义时,js会给这个函数添加一个prototype对象(原型对象),之后在原型对象上添加一个constructor属性并指向函数的引用。当函数作为构造函数创建对象时,新创建的对象的原型对象的constructor会继承构造函数的原型对象的constructor。
四.Object.prototype.toString.call()
Object对象,直接调用toString()就能返回[object Object]
其他对象,则需要通过call、apply来调用才能返回正确的类型信息