7

相关:关于原型链、原语和对象的混淆

在 Firebug 控制台中:

a = 12
a.constructor.prototype.isPrototypeOf(a) // prints 'false'

我认为这应该打印true

4

2 回答 2

9

a = 12创建一个原始数字,它与对象不完全相同Number。出于属性访问的目的,基元被隐式转换为对象。

a = 12; //a is a primitive
b = new Number(12); //b is an object
a.constructor.prototype.isPrototypeOf(a); //false because a is primitive
b.constructor.prototype.isPrototypeOf(b); //true because b is an object

根据ECMAScript 规范

当使用参数VisPrototypeOf调用该方法时,将执行以下步骤:

  1. 如果V不是对象,则返回false

严格来说,原始数字不是对象。

于 2013-03-29T14:04:15.790 回答
0
a = new Number(12);
a.constructor.prototype.isPrototypeOf(a) // prints 'true'

我不够聪明,无法告诉你为什么我只知道事情就是这样。是的,这很奇怪。

现在,你可以说12是一个原始的并且new Number(12)是一个对象”。但是你怎么解释这个?

(12).toFixed(3); // "12.000"

显然,JavaScript 在某个地方决定原语也可能是一个对象。

为什么会存在这种区别?你如何在这两种形式之间转换?这对性能有何影响?我没有答案的与这个问题相关的所有问题。

于 2013-03-29T13:59:07.967 回答