我目前正在研究javascript的Object.prototype.toString
方法。
在 Object.prototype.toString 的 MDN 参考页面中,它提到了
注意:从 JavaScript 1.8.5 开始,在空返回时调用 toString(( [对象 Null],未定义返回 [对象未定义],如 ECMAScript 第 5 版和随后的勘误表。
所以
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
作为函数内部this
toString()
(,但是当我尝试
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));