[英]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.