为什么null没有__proto__?

时间:2018-06-14 04:48:53

标签: javascript

JS中的

null被视为一个对象。 typeof null ==“object”// true

那么为什么null没有__proto__。所有对象在JS中都应该有__proto__

var n = null;
console.log(n.__proto__);   //Cannot read property '__proto__' of null`

有人可以提供详细的答案吗?

3 个答案:

答案 0 :(得分:5)

  JS中的

null被视为一个对象。 typeof null ==" object" //真

如前所述,null实际上是原始值(如undefined,布尔值,字符串值,数字值或符号)。但语言规范要求typeof null返回字符串"object"。 (同样,规范要求为函数对象而不是"function"返回"object",就像它对数组对象一样

但那只是故事的一半。

  

那么为什么null没有__proto__

您可能想知道:

  
    

如果两者都是原始值,为什么我可以访问字符串值("foo".__proto__)但不是null的原型?

  

那是因为布尔值,字符串和数字具有对象等价物(e.g. new String("foo")),并且当您尝试访问布尔/数字/字符串基元上的属性时,它们在内部转换为对象值< / p>

&#13;
&#13;
console.log("foo".slice)
// does `new String("foo").slice` internally
&#13;
&#13;
&#13;

但是对于undefinednull,不存在这样的对象,因此错误。

&#13;
&#13;
try {
  console.log(null.foo);
} catch(e) {
  console.log(e.message);
}

try {
  console.log(undefined.foo);
} catch(e) {
  console.log(e.message);
}
&#13;
&#13;
&#13;

  

所有对象在JS中都应该有__proto__

不一定。可以通过Object.create创建没有原型的对象:

&#13;
&#13;
const obj = Object.create(null);
console.log(obj.__proto__);
&#13;
&#13;
&#13;

答案 1 :(得分:3)

typeof null == "object"是一个错误,它实际上不是一个对象。有关typeof将其视为对象的原因的详细信息,请参阅why is typeof null "object"?

答案 2 :(得分:0)

来自MDN网络文档:

  

原语(原始值,原始数据类型)是不是的数据   一个对象,没有方法。在JavaScript中,有6个原语   数据类型:字符串,数字,布尔值, null ,未定义,符号(新的   ECMAScript 2015)。

     

大多数情况下,原始值直接表示在   最低级别的语言实现。

     

所有原语都是不可变的,即它们不能被改变。它是   重要的是不要将原语本身与赋值的变量混淆   原始价值。该变量可能会重新分配一个新值,但是   现有的值不能以对象,数组的方式改变,   和功能可以改变。

     

https://developer.mozilla.org/en-US/docs/Glossary/Primitive

此外:

  

在JavaScript的第一个实现中,JavaScript值是   表示为类型标记和值。对象的类型标记为0。   null表示为NULL指针(在大多数平台中为0x00)。   因此,null为0作为类型标记,因此返回伪造类型   值。

     

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof#null

相关问题