我使用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上复制它但不能,所以我假设我处于特定的怪癖模式。
我的问题:
答案 0 :(得分:5)
ECMAScript5规范在§15.2.4.2 about the Object.prototype.toString method中声明:
调用
toString
方法时,将执行以下步骤:
- 如果此值为
undefined
,请返回"[object Undefined]"
。- 如果此值为
null
,请返回"[object Null]"
。- 设O是调用ToObject传递此值作为参数的结果。
- 让class为O的[[Class]]内部属性的值。
- 返回串联三个字符串
醇>"[object "
,类和"]"
的结果的字符串值。
您遇到的问题是,IE7和8遵循较旧的ECMAScript3 standard,其在同一部分中说明
调用
toString
方法时,将执行以下步骤:
- 获取此对象的[[Class]]属性。
- 通过连接三个字符串
"[object "
,结果(1)和"]"
来计算字符串值。- 返回结果(2)。
醇>
也就是说,在早期版本的IE中,除非[object Undefined]
或[object Null]
函数构造,否则该方法不会返回Undefined
或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
答案 1 :(得分:0)