在 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/