null被视为一个对象。 typeof null ==“object”// true
那么为什么null没有__proto__
。所有对象在JS中都应该有__proto__
var n = null;
console.log(n.__proto__); //Cannot read property '__proto__' of null`
有人可以提供详细的答案吗?
答案 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>
console.log("foo".slice)
// does `new String("foo").slice` internally
&#13;
但是对于undefined
和null
,不存在这样的对象,因此错误。
try {
console.log(null.foo);
} catch(e) {
console.log(e.message);
}
try {
console.log(undefined.foo);
} catch(e) {
console.log(e.message);
}
&#13;
所有对象在JS中都应该有
__proto__
不一定。可以通过Object.create
创建没有原型的对象:
const obj = Object.create(null);
console.log(obj.__proto__);
&#13;
答案 1 :(得分:3)
typeof null == "object"
是一个错误,它实际上不是一个对象。有关typeof
将其视为对象的原因的详细信息,请参阅why is typeof null "object"?。
答案 2 :(得分:0)
来自MDN网络文档:
原语(原始值,原始数据类型)是不是的数据 一个对象,没有方法。在JavaScript中,有6个原语 数据类型:字符串,数字,布尔值, null ,未定义,符号(新的 ECMAScript 2015)。
大多数情况下,原始值直接表示在 最低级别的语言实现。
所有原语都是不可变的,即它们不能被改变。它是 重要的是不要将原语本身与赋值的变量混淆 原始价值。该变量可能会重新分配一个新值,但是 现有的值不能以对象,数组的方式改变, 和功能可以改变。
此外:
在JavaScript的第一个实现中,JavaScript值是 表示为类型标记和值。对象的类型标记为0。 null表示为NULL指针(在大多数平台中为0x00)。 因此,null为0作为类型标记,因此返回伪造类型 值。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof#null