为什么不使用Number作为构造函数?

22 javascript oop constructor jslint

我在JSLint中输入了这个语句:

var number = new Number(3);
Run Code Online (Sandbox Code Playgroud)

并收到以下消息:

不要使用Number作为构造函数.

这是为什么?该语句正在创建一个数字对象,而不是原始值,所以我不明白为什么使用new是一个问题.

编辑:感谢所有的回复.他们让我进一步思考,所以我在这里发布了一个后续问题.

Mat*_*ley 31

除了断开===和typeof返回"对象"之外,使用Number构造函数还会更改在布尔上下文中使用该值的方式.由于"new Number(0)"是一个对象,而不是文字值,因此它的计算结果为"true",因为它不是null.例如:

var n1 = 0;
var n2 = new Number(0);

n1 == n2  // true
n1 === n2 // false
if (n1) {
    // Doesn't execute
}
if (n2) {
    // Does execute, because n2 is an object that is not null
}
Run Code Online (Sandbox Code Playgroud)

编辑:甚至比在数字文字和数字对象之间断开===更糟糕,==甚至不能在两个数字对象之间工作(至少不是以直观的方式 - 他们测试身份,而不是相等).

var n1 = new Number(3);
var n2 = new Number(3);

alert(n1 == n2); // false
alert(n1 === n2); // false
Run Code Online (Sandbox Code Playgroud)

  • 我不认为应该不鼓励使用`Number`作为构造函数.开发人员只需要知道构造函数总是返回一个对象,以及如何使用它,而不是反对它. (7认同)

Ate*_*ral 14

var number = new Number(3);
alert(typeof number); // gives "object"
Run Code Online (Sandbox Code Playgroud)

使变量number具有某种类型Object可能不是最理想的结果.鉴于:

var number = Number(3);
alert(typeof number); // gives "number"
Run Code Online (Sandbox Code Playgroud)


Ben*_*ank 6

不幸的是,JSLint 文档除了“不希望看到”之外没有进一步详细说明,因此我们只能猜测。我自己的怀疑是,这是为了使类型检查更容易:

assert(typeof 3             === "number");
assert(typeof new Number(3) === "object");
Run Code Online (Sandbox Code Playgroud)

如果您在代码中混合使用这两者,您的类型检查会变得更加复杂:

if (typeof foo === "number" || foo instanceof Number) { … }
Run Code Online (Sandbox Code Playgroud)

然而,JSLint 也对 Object 和 Array 构造函数提出了质疑,它们并没有做出这种区分,所以它可能只是作者的编码风格偏好:

assert(typeof []           === "object");
assert(typeof new Array()  === "object");
assert(typeof {}           === "object");
assert(typeof new Object() === "object");
Run Code Online (Sandbox Code Playgroud)

编辑:史蒂文的回答提出了一个很好的观点——非类型转换相等运算符 (===)。这个运算符永远不会认为数字对象和数字原语相等,即使它们的值相同:

assert(3 !== new Number(3));
Run Code Online (Sandbox Code Playgroud)


Ste*_*wig 5

new Number()不返回与数字文字相同的对象.这意味着使用新的Number()break ===,这是检查Javascript中完全相等的最佳方法.

>>> 3 == 1 + 2
true
>>> 3 === 1 + 2
true
>>> new Number(3) == 1 + 2
true
>>> new Number(3) === 1 + 2
false
Run Code Online (Sandbox Code Playgroud)

您可以在附录C 的作者书籍JavaScript:The Good Parts中找到JSLint行为的基本原理.


pot*_*eat 5

它更慢,需要更多的内存。运行时可以将不可变文字视为不可变文字。这意味着当它遇到3代码中的某个地方时,它可以将其优化为共享对象。当您使用Number构造函数时,将为每个实例分配新的内存。


归档时间:

查看次数:

10298 次

最近记录:

9 年,1 月 前