我很好奇,因为我认为
Object.prototype.toString.call(null)
返回[object Object]
,但现在我正在检查Chrome和FF中的内容,并且都返回[object Null]
。现在的问题是,我可以假设Object.prototype.toString总能告诉我好的类型吗?
到目前为止,我正在使用此方法检查每个类型,但不是对于空值,我通过
检查空值obj === null;
谢谢!
注意澄清:这个问题'不是一个严重的情况,因为我正在使用
function isNull(obj) {
return obj === null;
}
function isUndefined(obj) {
return typeof obj === 'undefined';
}
效果很好,但如果Object.prototype.toString.call()
在旧浏览器中运行得足够,我可以删除这两个函数,并使用null
和undefined
扩展我的解决方案,如:
var types = ['Object', 'Number', 'String', 'Array', 'Function',
'Date', 'RegExp', 'Boolean', 'Error', 'Null', 'Undefined'].reduce(function(prev, type) {
prev['[object ' + type + ']'] = type.toLowerCase();
return prev;
}, {});
function isType(type) {
return function(obj) {
return getType(obj) === type;
};
}
function getType(obj) {
return types[Object.prototype.toString.call(obj)];
}
var isNull = isType('null');
document.querySelector('#console').textContent = isNull(null);

<div id='console'></div>
&#13;
答案 0 :(得分:4)
这在EcmaScript 5.1 Section 15.2.4.2 - Object.prototype.toString()
:
调用
toString
方法时,将执行以下步骤:
- 如果
this
值为undefined
,请返回"[object Undefined]"
。- 如果
this
值为null
,请返回"[object Null]"
。- 让
O
成为调用ToObject
传递this
值作为参数的结果。- 让
class
为[[Class]]
的{{1}}内部属性的值。- 返回串联三个字符串
醇>O
,"[object "
和class
的结果的字符串值。
EcmaScript 5对其进行了不同的定义:
调用
"]"
方法时,将执行以下步骤:
- 让
toString
成为调用O
传递ToObject
值作为参数的结果。- 让
this
为class
的{{1}}内部属性的值。- 返回串联三个字符串
醇>[[Class]]
,O
和"[object "
的结果的字符串值。
答案 1 :(得分:0)
Oriol的回答是正确的,但我想补充说,直接在数字或字符串上调用toString
与使用Object.prototype.toString
之间存在差异。< / p>
Object.prototype.toString
函数是通用的,所以如果我们这样做
var x = "hello, world";
alert(Object.prototype.toString.call(x));
我们将看到&#34; [对象字符串]&#34;。
但是,如果我们直接调用toString,就像这样:
alert(x.toString());
我们将看到&#34;你好,世界&#34;。原因是第二个示例中的toString
确实是String.prototype.toString
,这与通用Object.prototype.toString
方法不同。对于像6这样的数字也会出现同样的区别:
var y = 6;
alert(Object.prototype.toString.call(y)); // "[Object Number]"
alert(y.toString()); // "6"
alert(Number.prototype.toString.call(y)); // also "6"
在这种情况下,当您执行Number
时,原始值6将被装箱为y.toString()
的实例。当您连接字符串时,它是被调用的对象的toString
方法,而不是Object.prototype.toString
,这就是alert("I am " + y + " years old")
产生的原因&#34;我是6年旧的&#34;,不是&#34;我[对象号码]已经岁了#34;。
由于null
没有Null
原型或类似内容,因此执行null.toString()
会产生错误。