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

时间:2014-09-17 16:27:44

标签: javascript

我很好奇,因为我认为

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()在旧浏览器中运行得足够,我可以删除这两个函数,并使用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>
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:4)

这在EcmaScript 5.1 Section 15.2.4.2 - Object.prototype.toString()

中定义
  

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

     
      
  1. 如果this值为undefined,请返回"[object Undefined]"
  2.   
  3. 如果this值为null,请返回"[object Null]"
  4.   
  5. O成为调用ToObject传递this值作为参数的结果。
  6.   
  7. class[[Class]]的{​​{1}}内部属性的值。
  8.   
  9. 返回串联三个字符串O"[object "class的结果的字符串值。
  10.   

EcmaScript 5对其进行了不同的定义:

  

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

     
      
  1. toString成为调用O传递ToObject值作为参数的结果。
  2.   
  3. thisclass的{​​{1}}内部属性的值。
  4.   
  5. 返回串联三个字符串[[Class]]O"[object "的结果的字符串值。
  6.   

答案 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()会产生错误。