通常情况下,我们用typeof 操作符返回的字符创来判断对象的类型。
typeof 1 // number
typeof '1' // string
typeof true // boolean
typeof Symbol() // symbol
typeof undefined // undefined
typeof {} // object
typeof function(){} // function
但是typeof 并不能准确的判断一个对象变量。
typeof null // object
typeof {} // object
typeof [] // object
如果要做精确判断,应该使用Object.prototype.toString.call 。
每个对象都有一个toString()方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString() 方法被每个Object 对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 [object type],其中type 是对象的类型。
Object.prototype.toString.call('1') // [object String]
Object.prototype.toString.call(1) // [object Number]
Object.prototype.toString.call(true) // [object Boolean]
Object.prototype.toString.call(undefined) // [object Undefined]
Object.prototype.toString.call(null) // [object Null]
Object.prototype.toString.call(function(){}) // [object Function]
Object.prototype.toString.call([]) // [object Array]
Object.prototype.toString.call({}) // [object Object]
Object.prototype.toString.call(new Date) // [object Date]
Object.prototype.toString.call(/\d/) // [object RegExp]
为什么不直接使用obj.toString() 呢?
"1".toString() // '1'
[1,2].toString() // '1,2'
(function(){}).toString() // function (){}
这是因为toString 为Object 的原型方法,而Array ,function 等类型作为Object 的实例,都重写了toString 方法。不同的对象类型调用toString 方法时,调用的是对应的重写之后的toString 方法(function 类型返回内容为函数体的字符串,Array 类型返回元素组成的字符串.....),而不会去调用Object 上原型toString方法(返回对象的具体类型),所以采用obj.toString() 不能得到其对象类型,只能将obj 转换为字符串类型;因此,在想要得到对象的具体类型时,应该调用Object.prototype.toString.call 。
← Web Sql 笔记 中文乱码问题解决 →