从什么时候开始 null.toString() 返回 [object Null]

Since when does null.toString() return [object Null]?

本文关键字:返回 object Null 什么时候 开始 null toString      更新时间:2023-09-26

我很好奇,因为我认为

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()在较旧的浏览器中足够工作,我可以删除这两个函数并使用nullundefined扩展我的解决方案,如下所示:

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 方法时,将执行以下步骤:

  1. 如果this值为 undefined ,则返回 "[object Undefined]"
  2. 如果this值为 null ,则返回 "[object Null]"
  3. O是调用ToObject传递this值作为参数的结果。
  4. class O[[Class]]内部属性的值。
  5. 返回字符串值
  6. ,该值是连接三个字符串的结果 "[object "class"]"

EcmaScript 5 对它有不同的定义:

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

  1. O是调用ToObject传递this值作为参数的结果。
  2. class O[[Class]]内部属性的值。
  3. 返回字符串值
  4. ,该值是连接三个字符串的结果 "[object "class"]"