2017-07-21 32 views
0

我目前正在学习javascript的Object.prototype.toString方法。使用Object.prototype.toString函数与undefined和null

MDN reference page on Object.prototype.toString,它提到

注:在JavaScript开始1.8.5的toString()称为上的空返回 [对象空],和未定义返回[对象未定义],如在 定义第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] 

但我认为两者nullundefined是原始类型没有相应的包装类型(不像例如string原语类型和String对象包装),那么,为什么打印[object Null][object Undefined]在当事实上,null和undefined都不是对象。

还有,我想用代码等Object.prototype.toString.call(a),它是相同的a.toString()(即使用a作为this内部toString()功能),但是当我试图

var a = undefined; 
a.toString(); 

铬输出错误消息

Uncaught TypeError: Cannot read property 'toString' of undefined 

我的想法是undefined没有以任何方式与Object.prototype原型链接,这就是为什么a.toString()失败,bu t怎么样Object.prototype.toString.call(a)成功了?

+1

'undefined'和'null'不能访问'.'。 'Object.prototype'可以。 – 4castle

+1

只是因为一个值是原始的并不意味着它不能作为函数的'this'值传递。尝试做'Object.prototype.toString.call(1)' – 4castle

+1

我想它错误考虑'Object.prototype.toString.call(a)',其中'a'可以是任何东西,等同于'a.toString( )'。也许把Object.prototype.toString.call(a)设置为Object.prototype.toString函数的内部'this'属性为'a'更准确。 – Thor

回答

1

undefined就是这样,未定义。空被视为对象,但不会继承全局对象的任何方法。

你可以在它们两个上调用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));

+1

'null'不是一个对象,并且不被视为一个对象。 – Bergi

+0

@Bergi当我说作为一个对象,我的意思是关于typeof操作符。 “在第一实施方式的JavaScript,JavaScript的值表示为标记类型和一个值。对于对象的类型的标签为0零被表示为空指针(0×00在大多数平台)。因此,空具有0为类型标签,因此假的typeof返回值” https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof – Russell