繁体   English   中英

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

[英]Javascript declaring number in different ways?

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

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

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

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

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

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

第二个,没有new关键字,允许你对type-cast进行排序: Number(document.getElementById('formElem').value) === 123; 并有它的用途(主要与Date对象,根据我的经验)。 +document.getElementById('formElem').value) === 123 ,使用+运算符也可以实现转换为数字: +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

因此,将它们视为遗留问题,因为它们的原型仍然存在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM