2023.10.20谈谈js中检测数据类型的方法

16 阅读2分钟

1.typeof:检测基础数据类型和函数很好用

QQ截图20231020101031.png

  • 它能准确判断出的数据类型有:Number,String,Boolean,Undefined,Symbol,BigInt,Function。
  • 它的缺点就是不能准确判断 null 的类型,而是返回 “object”。对于数组,日期,普通对象等数据,统一返回 “object”。
  • 所以在判断基本数据类型(除了 null)和函数类型时,都会使用它。

2.constructor:返回实例对象的构造函数

QQ截图20231020102124.png

  • null,undefined 没有构造函数,自然也就访问不到该属性,因此不能使用此属性来判断
  • constructor 可以被改写,所以不一定准确
  • 基本上不会用它来做数据类型的检测。

3.instanceof:沿着原型链去找

它和 constructor 一样,也是临时拉来当壮丁。它的作用是检测实例对象是不是属于某个构造函数,可以用来做数据类型的检测。

QQ截图20231020104510.png

术业有专攻,所以它也有缺点:

不能检测基本数据类型

原型链可能被修改,导致检测结果不准确

只要能在原型链上找到构造函数,就返回 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 类似,都是基于原型链和原型对象去做判断的。它用来检查一个对象是否存在于另一个对象的原型链上。

6.Array.isArray:专业检测数组三十年

7.Number.isNaN