2

我正在使用 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+)?
4

2 回答 2

5

ECMAScript5 规范在§15.2.4.2 中说明了 Object.prototype.toString 方法

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

  1. 如果 this 值为undefined,则返回"[object Undefined]"
  2. 如果 this 值为null,则返回"[object Null]"
  3. 令 O 为调用 ToObject 并将 this 值作为参数传递的结果。
  4. 令 class 为 O 的 [[Class]] 内部属性的值。
  5. "[object "返回作为连接三个 String 、 class 和的结果的 String 值"]"

您面临的问题是 IE7 和 8 遵循较旧的ECMAScript3 标准,该标准在同一部分中指出

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

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

也就是说,在旧版本的 IE 中,该方法不会返回[object Undefined],或者[object Null]除非它们是由名为Undefinedor的函数构造的Null

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

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
于 2013-01-14T20:12:37.747 回答
0

正如其他人所说,null是类型Object并表示空对象引用

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

据我所知,它从 IE 6 开始就被支持了。(或更早的,我没有检查过。)

于 2013-01-14T20:09:12.763 回答