通常情况下,我们用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 (){}

这是因为toStringObject 的原型方法,而Arrayfunction 等类型作为Object 的实例,都重写了toString 方法。不同的对象类型调用toString 方法时,调用的是对应的重写之后的toString 方法(function 类型返回内容为函数体的字符串,Array 类型返回元素组成的字符串.....),而不会去调用Object 上原型toString方法(返回对象的具体类型),所以采用obj.toString() 不能得到其对象类型,只能将obj 转换为字符串类型;因此,在想要得到对象的具体类型时,应该调用Object.prototype.toString.call

Last Updated: 2/24/2020, 9:11:55 PM