Object.prototype.toString.call(null)何时返回[object Object]?

时间:2013-01-14 20:04:23

标签: javascript internet-explorer object object-type

我使用Object.prototype.toString.call来识别变量类型。我希望有以下行为:

Object.prototype.toString.call({}) => [object Object]
Object.prototype.toString.call([]) => [object Array]
Object.prototype.toString.call(undefined) => [object Undefined]
Object.prototype.toString.call(null) => [object Null]

这通常可以正常工作,但我目前面临的情况(在Internet Explorer中)Object.prototype.toString.call(undefined)Object.prototype.toString.call(null)都返回[object Object],我不明白为什么。我试图在jsfiddle.net上复制它但不能,所以我假设我处于特定的怪癖模式。

我的问题:

  • 这是一个已知的“行为”,这是什么时候发生的?
  • 有更可靠的方法来检查对象类型(我需要支持IE7 +)?

2 个答案:

答案 0 :(得分:5)

ECMAScript5规范在§15.2.4.2 about the Object.prototype.toString method中声明:

  

调用toString方法时,将执行以下步骤:

     
      
  1. 如果此值为undefined,请返回"[object Undefined]"
  2.   
  3. 如果此值为null,请返回"[object Null]"
  4.   
  5. 设O是调用ToObject传递此值作为参数的结果。
  6.   
  7. 让class为O的[[Class]]内部属性的值。
  8.   
  9. 返回串联三个字符串"[object ",类和"]"的结果的字符串值。
  10.   

您遇到的问题是,IE7和8遵循较旧的ECMAScript3 standard,其在同一部分中说明

  

调用toString方法时,将执行以下步骤:

     
      
  1. 获取此对象的[[Class]]属性。
  2.   
  3. 通过连接三个字符串"[object ",结果(1)和"]"来计算字符串值。
  4.   
  5. 返回结果(2)。
  6.   

也就是说,在早期版本的IE中,除非[object Undefined][object Null]函数构造,否则该方法不会返回UndefinedNull

您可以使用以下方法更可靠地检查类型:

typeof x === "object"    // x is any sort of object
typeof x === "undefined" // x is undefined
x instanceof Array       // x is an array
x === null               // x is null

答案 1 :(得分:0)

正如其他人所说,null属于Object类型,代表空对象引用

检查值类型的更可靠方法是typeof operator

据我所知,它自IE 6以来一直受到支持。(或者更早,我没有检查过。)