Javascript 新编号()与编号()的比较

Javascript 新编号()与编号()的比较,javascript,Javascript,newnumber()和Number()之间有什么区别?我知道newnumber()创建了一个Number对象,Number()只是一个函数,但我应该什么时候调用它,为什么 Mozilla在相关报道中表示: 不要使用布尔对象将非布尔值转换为布尔值。相反,使用布尔值作为函数来执行此任务 x = Boolean(expression); // preferred x = new Boolean(expression); // don't use 为什么呢?我以为结果是一样的 new Num

newnumber()
Number()
之间有什么区别?我知道
newnumber()
创建了一个
Number
对象,
Number()
只是一个函数,但我应该什么时候调用它,为什么

Mozilla在相关报道中表示:

不要使用布尔对象将非布尔值转换为布尔值。相反,使用布尔值作为函数来执行此任务

x = Boolean(expression);     // preferred
x = new Boolean(expression); // don't use
为什么呢?我以为结果是一样的

new Number( x )
创建一个新的包装器对象。我认为没有充分的理由使用这个

Number( x )
将传递的参数转换为数值。您可以使用它将一些变量强制转换为数字类型。但是,这可以完成相同的工作:

+x

一般来说:

你不需要这些:

new Number()
new String()
new Boolean()
您可以将其用于铸造:

Number( value )
String( value )
Boolean( value )
但是,铸造有更简单的解决方案:

+x // cast to Number
'' + x // cast to String
!!x // cast to Boolean
Boolean(expression)
将简单地将表达式转换为布尔基元值,而
new Boolean(expression)
将围绕转换后的布尔值创建一个包装对象

从这一点可以看出区别:

// Note I'm using strict-equals
new Boolean("true") === true; // false
Boolean("true") === true; // true
还有这个(谢谢@hobbs):



注意:虽然包装器对象将在必要时自动转换为基本体(反之亦然),但我只能想到一种情况,即如果要将属性附加到单个值,您需要使用
新布尔值
,或其他任何基本体包装器。例如:

var b = new Boolean(true);
b.relatedMessage = "this should be true initially";
alert(b.relatedMessage); // will work

var b = true;
b.relatedMessage = "this should be true initially";
alert(b.relatedMessage); // undefined
永远值得咨询;根据第15.7.1节:

Number
作为函数而不是构造函数调用时,它将执行类型转换

类似地,使用
布尔值作为函数(15.6.1):

当布尔函数作为函数而不是构造函数调用时,它将执行类型转换

…这意味着您参考第9.2节(“ToBoolean”):

抽象操作ToBoolean根据表11将其参数转换为布尔类型的值:
未定义
=
错误

Null
=
false

Boolean
=结果等于输入参数(无转换)。
Number
=如果参数为+0,则结果为false,−0,或NaN;否则,结果是正确的。
String
=如果参数为空字符串(其长度为零),则结果为false;否则,结果是正确的。
Object
=
true

new Boolean(value)
Boolean(value)
之间的区别基本上是前者返回一个对象,而后者则根据上述内容返回一个原语。这很重要,因为对象是真实的:

var b = new Boolean(false);

display(b);            // Displays "false"
if (b) {
  display("true");     // This is the path that gets taken, displaying "true"
}
else {
  display("false");    // This path does NOT get taken
}

…而为了测试布尔值,您几乎总是需要布尔值。

case with
instanceof

const a = new Number('123'); // a === 123 is false
const b = Number('123'); // b === 123 is true
a instanceof Number; // is true
b instanceof Number; // is false

typeof(Boolean(“true”)==“Boolean”
,而
typeof(new Boolean(“true”)==“object”
,而包装器对象将在必要时自动转换为原语“这是真的,但有些误导。对象(包括
Boolean
对象)在布尔上下文中始终计算为
true
if(新布尔值(0)){alert(“Oops,0为true”);}
。要获得“预期”值,请调用
valueOf
new Boolean(0)。valueOf()==false
您的速记可能更简单,但它们不如使用数字/字符串/布尔函数来做同样的事情那么清楚。@Nigel True,但在JavaScript程序员中,数字强制的
+
前缀是常见的,而且是不可接受的(据我所见)首选。稍后维护您代码的人可能不像您那样精通JS。我进入了一个JS项目,“转换为数字”速记让我感到困惑。我花了几分钟才弄明白。2019年,当有更清晰的替代方案时,没有理由使用晦涩难懂的速记。
const a = new Number('123'); // a === 123 is false
const b = Number('123'); // b === 123 is true
a instanceof Number; // is true
b instanceof Number; // is false
// Type conversion to primitive value    
const a = Number('42')
a === 42  // true
a.answer = 'You asked the wrong question'
a.answer // undefined

// Object
const b = new Number('42')
b === 42 // false
b.answer = 'Life, the Universe, and Everything'
b.valueOf() === 42 // true
b.answer // 'Life, the Universe, and Everything'