Javascript以不同的方式声明数字?

Cha*_*amp 9 javascript

var a = 1;
var b = Number(1);
var c = new Number(1);
Run Code Online (Sandbox Code Playgroud)

我想知道这三个陈述之间有什么区别.据我所知,第一和第二语句是一样的,if(a===b)给予true,但第三个将创建一个对象的类型号.

我想知道的是这些方法是如何不同的,一方面会给另一方带来什么好处呢?

Poi*_*nty 11

像是1原始的值,而不是对象.JavaScript通常会Number在必要时将数字提升为对象.很少有理由明确地构建一个,并且肯定没有特别的"优势".Number(1)虽然Number构造函数是将值强制为数字的几种方法之一,但也没有理由这样.

  • @zzzzBov不,他们不是.`typeof {}`=>"object",但`typeof 123` =>"number".您不能将属性添加到原始值,但可以将它们添加到"Number"实例. (3认同)
  • @zzzzBov我们要求所有基元的平等对象权利! (3认同)
  • @zzzzBov参见规范,第4.3.2和4.3.3节.如果你想把它们称为对象或以这种方式对它们进行思考,那对我来说没问题,但正式地说它们与对象不同. (2认同)
  • 它们是 OO 意义上的 _not_ 对象(如演示的那样,它们没有属性)。如果您愿意,您可以将它们称为其他一些非面向对象意义上的“对象”。 (2认同)
  • @zzzzBov它们不是_any_有意义的OO相关的"对象"一词中的对象.`1 instanceof Object`也是假的; 如上所述,它们没有属性,也不能用作其他对象的原型.它们是_not objects_ in _any object usage_,在Javascript中是允许的. (2认同)
  • @EliasVanOotegem 不,它们没有链接到原型。必要时,该语言会在其对象“伙伴”类型中隐式装箱原语。 (2认同)
  • @EliasVanOotegem是 - 如果你查看规范,第11.2.1节,你可以看到如何定义属性访问器(`.`和`[]`).简而言之,调用内部`toObject`函数(第9.9节)来完成工作. (2认同)