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

时间:2012-09-10 15:43:56

标签: javascript

var a = 1;
var b = Number(1);
var c = new Number(1);

我想知道这三个陈述之间有什么区别。 我理解第一和第二个陈述是相同的,因为if(a===b)给出true,但第三个陈述将创建一个类型为数字的对象

我想知道的是这些方法是如何不同的,以及一方面会给予另一方面的任何好处?

3 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:2)

简而言之,非:new String()new Number()构造函数将被忽略,如果你想为自己节省一个麻烦的世界。
你在这里介绍的前两种方法为变量赋予一个数值常量,第三种方式 - 就像你说的 - 创建一个对象。该对象的值将为1,但您可以更改该值而不会丢失您为该对象设置的任何特定方法。

在对象中存储数字或字符串没有太多优点。 AFAIK,你唯一能够“获得”的东西在调用某些方法时会比常量有非常非常微小的性能差异,比如toExponential等...在我的看来,为你必须使用的所有数字创建对象都不值得。我认为它是JS的坏部分之一,旨在使Java Applet开发人员熟悉该语言。

第二个,没有new关键字,允许你进行类型转换:Number(document.getElementById('formElem').value) === 123;并且有其用途(根据我的经验,主要使用Date对象)。但话说回来,使用+运算符也可以实现转换为数字:+document.getElementById('formElem').value) === 123

总的来说,要远离这些原始构造函数。它们仍然存在的唯一原因是因为它们是物体,因此具有原型。现在那个是一个优势:

Number.prototype.addOneToString = function()
{
    return (1+this).toString();
};
String.prototype.UpperFirst = function()
{
    return this.charAt(0).toUpperCase() + this.slice(1);
}
var foo = new Number(3);
foo.addOneToString();//returns "4"
foo = new String('foo');
foo.UpperFirst();//Foo

由于JS在其对象实例中包装常量操作数,因此当语句需要它时,您可以将原型方法(本机方法或自制方法)应用于任何常量。 (感谢Pointy为此,以及+1)

(3).addOneToString();//"4"
'foo'.UpperFirst();//Foo

所以只要将它们视为遗留问题,因为它们的原型仍然存在。

答案 2 :(得分:0)

在 ES12 及之后,您可以使用以下方式声明大数。

const oneMillion = 1_000_000;

var oneMillion1 = 1_000_000;

您可以使用分隔符 _,以提高可读性