新号码()与号码()

Tom*_*ker 57 javascript

new Number()和之间有什么区别Number()?我得到它new Number()创建一个Number对象,Number()只是一个函数,但什么时候应该调用哪个,为什么?

在相关的说明中,Mozilla说:

不要使用Boolean对象将非布尔值转换为布尔值.而是使用布尔值作为执行此任务的函数.

x = Boolean(expression);     // preferred
x = new Boolean(expression); // don't use
Run Code Online (Sandbox Code Playgroud)

这是为什么?我以为结果是一样的?

Dav*_*ang 54

Boolean(expression)将简单地将表达式转换为布尔原始值,同时new Boolean(expression)将围绕转换后的布尔值创建包装器对象.

可以看出差异:

// Note I'm using strict-equals
new Boolean("true") === true; // false
Boolean("true") === true; // true
Run Code Online (Sandbox Code Playgroud)

还有这个(感谢@hobbs):

typeof new Boolean("true"); // "object"
typeof Boolean("true"); // "boolean"
Run Code Online (Sandbox Code Playgroud)

注意:虽然包装器对象将在必要时自动转换为原语(反之亦然),但只有一种情况我可以想到你想要使用的地方new Boolean,或原始的任何其他包装器 - 如果你想将属性附加到单个值.例如:

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
Run Code Online (Sandbox Code Playgroud)

  • "虽然必要时包装器对象会自动转换为原语"这是真的,但有些误导.对象(包括`Boolean`对象)总是在布尔上下文中求值为`true`:`if(new Boolean(0)){alert("Oops,0 is true."); }`.要获得"预期"值,请调用`valueOf`:`new Boolean(0).valueOf()=== false` (7认同)
  • 和`typeof(Boolean("true"))==="boolean"`,而`typeof(new Boolean("true"))==="object"`. (4认同)

Šim*_*das 31

new Number( x )
Run Code Online (Sandbox Code Playgroud)

创建一个新的包装器对象.我认为没有合理的理由使用它.

Number( x )
Run Code Online (Sandbox Code Playgroud)

将传递的参数转换为Number值.您可以使用它将一些变量强制转换为Number类型.然而,这完成了同样的工作:

+x
Run Code Online (Sandbox Code Playgroud)

通常:

你不需要那些:

new Number()
new String()
new Boolean()
Run Code Online (Sandbox Code Playgroud)

您可以使用它们进行投射:

Number( value )
String( value )
Boolean( value )
Run Code Online (Sandbox Code Playgroud)

但是,有更简单的铸造解决方案:

+x // cast to Number
'' + x // cast to String
!!x // cast to Boolean
Run Code Online (Sandbox Code Playgroud)

  • 你的缩写可能是_simpler_,但它们不像使用Number/String/Boolean函数做同样的事情那么清楚. (18认同)
  • @Nigel是的,但是在JavaScript程序员中,数字强制的`+`前缀很常见,而且(我可以看到)首选. (4认同)
  • 以后维护你的代码的人可能不像你那么精通 JS。我转向了一个 JS 项目,“转换为数字”的简写让我感到困惑。我花了几分钟才弄清楚。2019 年,当有更清晰的替代方案时,没有理由使用晦涩的速记。 (3认同)

T.J*_*der 19

总是值得参考规范 ; 来自第15.7.1节:

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

同样,使用Boolean函数(15.6.1):

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

...这意味着你参考9.2节("ToBoolean"):

抽象操作ToBoolean根据表11将其参数转换为Boolean类型的值:
Undefined= false
Null= false
Boolean=结果等于输入参数(无转换).
Number=如果参数为+ 0,-0或NaN,则结果为false; 否则结果是真的.
String=如果参数为空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
}
Run Code Online (Sandbox Code Playgroud)

实例 ...而你几乎总是想要布尔值来测试它们.