var a = 1;
var b = Number(1);
var c = new Number(1);
我想知道这三个陈述之间有什么区别。
我理解第一和第二个陈述是相同的,因为if(a===b)
给出true
,但第三个陈述将创建一个类型为数字的对象。
我想知道的是这些方法是如何不同的,以及一方面会给予另一方面的任何好处?
答案 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;
您可以使用分隔符 _
,以提高可读性