版本

no-new-wrappers

禁止使用 StringNumberBoolean 对象的 new 运算符

JavaScript 中有三种具有包装器对象的原始类型:字符串、数字和布尔值。它们分别由构造函数 StringNumberBoolean 表示。每当读取这些原始值之一时,就会使用原始包装器类型,从而为它们提供类似对象的功能,例如方法。在幕后,会创建并销毁相关包装器类型的一个对象,这就是为什么您可以对原始值(例如)调用方法的原因。

var text = "Hello world".substring(2);

在此示例中,在幕后,会构造一个 String 对象。substring() 方法存在于 String.prototype 上,因此字符串实例可以访问它。

还可以手动创建一个新的包装器实例

var stringObject = new String("Hello world");
var numberObject = new Number(33);
var booleanObject = new Boolean(false);

尽管可以,但没有充分的理由将这些原始包装器用作构造函数。它们往往会让其他开发人员感到困惑,因为它们看起来应该像原始类型一样工作,但实际上并非如此。例如

var stringObject = new String("Hello world");
console.log(typeof stringObject);       // "object"

var text = "Hello world";
console.log(typeof text);               // "string"

var booleanObject = new Boolean(false);
if (booleanObject) {    // all objects are truthy!
    console.log("This executes");
}

第一个问题是原始包装器对象实际上是对象。这意味着 typeof 将返回 "object" 而不是 "string""number""boolean"。第二个问题与布尔对象有关。每个对象都是真值,这意味着 Boolean 的实例始终解析为 true,即使其实际值为 false

由于这些原因,避免使用 new 来使用原始包装器类型被认为是一种最佳实践。

规则详情

此规则旨在消除使用 new 运算符来创建 StringNumberBoolean 对象。因此,每当它看到 new Stringnew Numbernew Boolean 时,它都会发出警告。

此规则的错误代码示例

在游乐场中打开
/*eslint no-new-wrappers: "error"*/

var stringObject = new String("Hello world");
var numberObject = new Number(33);
var booleanObject = new Boolean(false);

var stringObject = new String;
var numberObject = new Number;
var booleanObject = new Boolean;

此规则的正确代码示例

在游乐场中打开
/*eslint no-new-wrappers: "error"*/

var text = String(someValue);
var num = Number(someValue);

var object = new MyString();

何时不使用它

如果您想允许使用原始包装器对象,则可以安全地禁用此规则。

版本

此规则是在 ESLint v0.0.6 中引入的。

进一步阅读

资源

更改语言