1.typeof:检测基础数据类型和函数很好用
- 它能准确判断出的数据类型有:Number,String,Boolean,Undefined,Symbol,BigInt,Function。
- 它的缺点就是不能准确判断 null 的类型,而是返回 “object”。对于数组,日期,普通对象等数据,统一返回 “object”。
- 所以在判断基本数据类型(除了 null)和函数类型时,都会使用它。
2.constructor:返回实例对象的构造函数
- null,undefined 没有构造函数,自然也就访问不到该属性,因此不能使用此属性来判断
- constructor 可以被改写,所以不一定准确
- 基本上不会用它来做数据类型的检测。
3.instanceof:沿着原型链去找
它和 constructor 一样,也是临时拉来当壮丁。它的作用是检测实例对象是不是属于某个构造函数,可以用来做数据类型的检测。
术业有专攻,所以它也有缺点:
不能检测基本数据类型
原型链可能被修改,导致检测结果不准确
只要能在原型链上找到构造函数,就返回 true,所以类型可能不准确
4.Object.prototype.toString:是个大拿
参数
默认情况下,toString()
不接受任何参数。然而,继承自 Object
的对象可能用它们自己的实现重写它,这些实现可以接受参数。例如,Number.prototype.toString()
和 BigInt.prototype.toString()
方法接受一个可选的 radix
参数
返回值
一个表示该对象的字符串。
Object.prototype.toString()
返回 "[object Type]"
,这里的 Type
是对象的类型
console.log(toString.call('123')) // [object String]
console.log(toString.call(null)) // [object Null]
console.log(toString.call(true)) // [object Boolean]
console.log(toString.call({})) // [object Object]
console.log(toString.call([])) // [object Array]
console.log(toString.call(function(){})) // [object Function]
console.log(toString.call(new Map)) // [object Map]
console.log(toString.call(new WeakSet)) // [object WeakSet]
5.Object.prototype.isPrototypeOf:和 instanceof 类似
function Person() {
}
let person = new Person()
console.log(Person.prototype.isPrototypeOf(person))
isPrototypeOf 和 instanceof 类似,都是基于原型链和原型对象去做判断的。它用来检查一个对象是否存在于另一个对象的原型链上。