我目前正在研究javascript的Object.prototype.toString
方法。
在MDN reference page on Object.prototype.toString中,它提到了
注意:从JavaScript 1.8.5开始toString()调用null返回 [object Null]和undefined返回[object Undefined],如中所定义 第5版ECMAScript和随后的勘误表。
所以
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
对象包装器),所以为什么{实际上null和undefined不是对象时打印{1}}和[object Null]
。
而且,我想像[object 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)
怎么会成功?
答案 0 :(得分:1)
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));