javascript - 对原型(prototype)链、原语和对象的困惑

标签 javascript prototype primitive

在 Firebug 控制台中:

>>> a=12 
12
>>> a.__proto__
Number {}
>>> (12).__proto__
Number {}
>>> a.constructor.prototype === (12).__proto__
true
>>> a.constructor.prototype.isPrototypeOf(a)
false

与其他几行相比,最后一行让我很困惑。另见 Constructor.prototype not in the prototype chain?

最佳答案

当您将 . 运算符与原语一起使用时,语言会使用适当的对象类型(在本例中为 Number)自动将其装箱。这是因为 JavaScript 中的简单原始类型实际上不是 Object 实例。

因此,实际的左侧

a.__proto__

不是数字 12 而本质上是 new Number(12)。但是,变量“a”仍然是简单的数值 12

编辑Section 8.7 of the spec用典型的 ECMA 262 月亮语言“解释”这一点。我找不到一个清晰的段落来描述原始 baseValue 被视为数字、 bool 值或字符串实例的方式,但该部分直接暗示了这一点。我认为因为那些非原始合成值是短暂的(它们只是“真实的”,而 .[] 表达式正在被评估)规范只是在谈论关于行为,而不明确要求构造一个实际的 Number。不过我是在猜测。

关于javascript - 对原型(prototype)链、原语和对象的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15705232/

相关文章:

Delphi OpenGL绘图

java - 为什么 Object[] 可以存储原语?

javascript - jQuery Mobile 中的 AJAX 请求后刷新页面

javascript - 在 application.css 中找不到//=require jquery.nouislider

javascript - ReactJS - 如何为 SEO 渲染 iframe 内部内容服务器端?

javascript - node-mysql:使用 object.query 时出错

javascript - 在这种情况下如何进行原型(prototype)继承?

JavaScript继承: why copy from an instance?

javascript - 在javascript中的类定义中添加原型(prototype)

javascript - 是什么让 JavaScript 中的原始值和对象包装值的可用性有用?