使用 Object.prototype.toString 函数,其中未定义且为 null
我目前正在研究 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]
但我认为
null
和
undefined
都是没有相应包装器类型的原始类型(不同于例如
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)
怎么会成功呢?
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));