new Number() 与 Number()

IT技术 javascript
2021-01-19 02:47:25

new Number()和 和有什么不一样Number()我知道它new Number()创建了一个Number对象并且Number()只是一个函数,但是我什么时候应该调用 which,为什么?

在相关说明中,Mozilla 说:

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

x = Boolean(expression);     // preferred
x = new Boolean(expression); // don't use

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

5个回答

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

可以看出不同之处:

// Note I'm using strict-equals
new Boolean("true") === true; // false
Boolean("true") === true; // true

还有这个(感谢@hobbs):

typeof new Boolean("true"); // "object"
typeof Boolean("true"); // "boolean"

注意:虽然包装器对象会在必要时自动转换为原语(反之亦然),但我只能想到一种情况,你想在哪里使用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
这个 js lib github.com/lordnull/dice.js返回new Number(..)具有各种属性的a以及原始值。
2021-03-25 02:47:25
“虽然包装器对象将在必要时自动转换为原语”这是真的,但有点误导。对象(包括Boolean对象)总是true在布尔上下文中评估为if (new Boolean(0)) { alert("Oops, 0 is true."); }要获得“预期”值,请调用valueOfnew Boolean(0).valueOf() === false
2021-04-02 02:47:25
typeof(Boolean("true")) === "boolean",而typeof(new Boolean("true")) === "object"
2021-04-06 02:47:25
new Number( x )

创建一个新的包装对象。我不认为有充分的理由使用它。

Number( x )

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

+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
您的速记可能更简单,但不如使用 Number/String/Boolean 函数来做同样的事情那么清楚。
2021-03-14 02:47:25
@Nigel 是的,但在 JavaScript 程序员中,+数字强制前缀很常见,并且(从我所见)是首选。
2021-03-22 02:47:25
稍后维护您代码的人可能不像您那样精通 JS。我转到了一个 JS 项目,“转换为数字”的速记让我很困惑。在我弄明白之前花了几分钟的时间。在 2019 年,当有更清晰的替代方案可用时,没有理由使用晦涩的速记。
2021-03-23 02:47:25
@StormMuller 几分钟?更像是几秒钟。更令人困惑的是Number大写开始,而JS的命名约定是函数的camelCase。更令人困惑的是,您可以使用 new调用它,但不必如此。图A:这个问题。
2021-04-05 02:47:25

始终值得咨询规范来自第 15.7.1 节:

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

类似地,Boolean作为函数使用(15.6.1):

当 Boolean 作为函数而不是构造函数被调用时,它执行类型转换。

...这意味着您查阅第 9.2 节(“ToBoolean”):

抽象操作 ToBoolean 根据表 11 将其参数转换为 Boolean 类型的值:
Undefined== false
Null= false
Boolean结果等于输入参数(无转换)。
Number= 如果参数为 +0、-0 或 NaN,则结果为假;否则结果为真。
String= 如果参数为空字符串(其长度为零),则结果为假;否则结果为真。
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
}

活生生的例子......而你几乎总是想要布尔值来测试它们。

案例与 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
// 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'