我在JSLint中输入了这个语句:
var number = new Number(3);
并收到以下消息:
不要使用Number作为构造函数.
这是为什么?该语句正在创建一个数字对象,而不是原始值,所以我不明白为什么使用new
是一个问题.
编辑:感谢所有的回复.他们让我进一步思考,所以我在这里发布了一个后续问题.
除了断开===和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 }
编辑:甚至比在数字文字和数字对象之间断开===更糟糕,==甚至不能在两个数字对象之间工作(至少不是以直观的方式 - 他们测试身份,而不是相等).
var n1 = new Number(3); var n2 = new Number(3); alert(n1 == n2); // false alert(n1 === n2); // false
var number = new Number(3); alert(typeof number); // gives "object"
使变量number
具有某种类型Object
可能不是最理想的结果.鉴于:
var number = Number(3); alert(typeof number); // gives "number"
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
您可以在附录C 的作者书籍JavaScript:The Good Parts中找到JSLint行为的基本原理.