开发者问题收集

使用 Object.prototype.toString 函数,其中未定义且为 null

2017-07-21
649

我目前正在研究 javascript 的 Object.prototype.toString 方法。

Object.prototype.toString 的 MDN 参考页面 中,它提到了

Note: Starting in JavaScript 1.8.5 toString() called on null returns [object Null], and undefined returns [object Undefined], as defined in the 5th Edition of ECMAScript and a subsequent Errata.

所以

var a = undefined;
Object.prototype.toString.call(a); //chrome prints [object Undefined]

var b = null;
Object.prototype.toString.call(b); //chrome prints [object Null]

但我认为 nullundefined 都是没有相应包装器类型的原始类型(不同于例如 string 原始类型和 String 对象包装器),那么为什么会打印 [object Null][object Undefined] ,而实际上 null 和 undefined 不是对象。

此外,我认为使用如下代码 Object.prototype.toString.call(a) ,它与 a.toString() 相同(即使用 a 作为 toString() 函数内的 this ),但是当我尝试

var a = undefined;
a.toString();

Chrome 打印错误消息

Uncaught TypeError: Cannot read property 'toString' of undefined

我的想法是 undefined 不以任何方式原型链接到 Object.prototype ,这就是 a.toString() 失败的原因,但是 Object.prototype.toString.call(a) 怎么会成功呢?

1个回答

undefined 就是 undefined。Null 被视为对象,但不继承全局对象的任何方法。

您可以在两者上调用 Object.prototype.toString.call,而不能调用 undefined.toString 或 null.toString,原因是前者是一个简单的函数调用。后者试图调用对象方法,两者都没有。根据 Mozilla 的说法,typeof null 返回对象“出于遗留原因”。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null

var a;
console.log(typeof a);
console.log(Object.prototype.toString.call(a)); //chrome prints [object Undefined]
console.log(typeof Object.prototype.toString.call(a));

var b = null;
console.log(typeof b);
console.log(Object.prototype.toString.call(b)); //chrome prints [object Null]
console.log(typeof Object.prototype.toString.call(b));
Russell
2017-07-21