从什么时候开始 null.toString() 返回 [object Null]
Since when does null.toString() return [object Null]?
我很好奇,因为我认为
Object.prototype.toString.call(null)
返回[object Object]
,但现在我在Chrome和FF中检查,并且都返回了[object Null]
。现在的问题是,我是否可以假设Object.prototype.toString总是会告诉我好的类型?
正在使用此方法检查每种类型,但不检查空值,我正在通过以下方式检查空值
obj === null;
谢谢!
澄清说明:这个"问题"不是一个严重的情况,因为我正在使用的ATM
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>
Oriol 的回答是正确的,但我想补充一点,直接调用toString
,比如数字或字符串,与使用 Object.prototype.toString
是有区别的。
Object.prototype.toString
函数是通用的,所以如果我们这样做
var x = "hello, world";
alert(Object.prototype.toString.call(x));
我们将看到"[对象字符串]"。
但是,如果我们直接调用 toString,则如下所示:
alert(x.toString());
我们将看到"你好,世界"。这样做的原因是第二个示例中的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"
在这种情况下,当您执行 y.toString()
时,基元值 6 被装箱到Number
的实例中。当你连接字符串时,调用的是对象的toString
方法,而不是Object.prototype.toString
,这就是为什么alert("I am " + y + " years old")
产生"我是 6 岁",而不是"我是 [对象编号] 岁"。
由于null
没有Null
原型或类似的东西,因此null.toString()
会产生错误。
在 EcmaScript 5.1 第 15.2.4.2 节中定义的 - Object.prototype.toString()
:
调用
toString
方法时,将执行以下步骤:
- 如果
this
值为undefined
,则返回"[object Undefined]"
。- 如果
this
值为null
,则返回"[object Null]"
。- 让
O
是调用ToObject
传递this
值作为参数的结果。- 设
返回字符串值class
O
的[[Class]]
内部属性的值。- ,该值是连接三个字符串的结果
"[object "
、class
和"]"
。
EcmaScript 5 对它有不同的定义:
调用
toString
方法时,将执行以下步骤:
O
是调用ToObject
传递this
值作为参数的结果。- 设
返回字符串值class
O
的[[Class]]
内部属性的值。- ,该值是连接三个字符串的结果
"[object "
、class
和"]"
。
- 在 Reactjs 中返回 [Object object] 而不是 Dom 字符串
- 为什么jQuery.cookie插件返回“[object object]”
- 控制台返回[Object-Object]而不是对象成员
- 当chrome检查器为jQuery变量返回[object object]时,如何返回实际数据
- 使用javascript时返回[object HTMLDivElement]
- 'canvas.getContext('2d')' 返回 'Object'
- jQuery AJAX 调用返回 [object Object]
- Django:返回[Object object]而不是django视图数组
- 为什么 Object.prototype.toString 返回 [object Object]
- Firebase-回调返回[object object]
- 返回object的javascript函数返回[object object]
- 按Javascript中的值返回Object
- for在循环中返回[object object]
- jQuery每个都返回[object object]
- 从解析对象检索信息时,解析JavaScript返回[object,object]
- JQuery text();从解析对象检索信息时返回[object object]
- 如何在metrojs中返回object contain函数
- 从什么时候开始 null.toString() 返回 [object Null]
- Knockout.js动态HTML绑定返回[object object]
- 函数返回[Object Object]而不是值