如何准确地判断变量的数据类型 ?

113 阅读1分钟

typeof 可以用来判断除了 null 的基本数据类型 和 引用数据类型中的 function

因为 typeof null 返回的是 object

// typeof 判断基本数据类型和 function
typeof 1 //   'number'
typeof 'a' //   'string'
typeof flase //   'boolean'
typeof undefinded //   'undefined'
typeof null //   'object' 
typeof function(){} //   'function'
let x = BigInt(999999999999999);
typeof x //    'bigint'
let b = Symbol('key')
typeof b //   'symbol'

如果使用 typeof 去判断引用数据类型比如数组、对象时返回的都是 object

typeof [] //    'object'
typeof {} //    'object'

如果想要得到更加准确的判断对象就需要使用其他的方法

Object.prototype.toString()

每个对象都有一个 toString() 方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString() 方法被每个 Object 对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 “[object type]”,其中 type 是对象的类型。

就比如

const obj = {}
obj.toString() //    '[object Object]'

要想要其他的对象使用 Object.prototype.toString() 就需要使用 Function.prototype.call() 改变 this 的指向

Object.prototype.toString.call([]) //    '[object Array]'

const blob = new Blob(['hello'], { type: 'text/html'})
Object.prototype.toString.call(blob) //    '[object Blob]'

const div = document.querySelectorAll('div')
Object.prototype.toString.call(div) // '[object NodeList]'

可以看出 blob 、 NodeList 、 Array 都可以判断出来

如果要封装成函数可以使用 String.prototype.slice(8,-2) 就可以截取到对象的类型