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) 就可以截取到对象的类型