# no-new-wrappers
禁止带有 String、Number 和 Boolean 对象的 new 运算符
JavaScript 中有三种具有包装对象的原始类型:字符串、数字和布尔值。它们分别由构造函数 String、Number 和 Boolean 表示。每当读取这些原始值之一时都会使用原始包装器类型,从而为它们提供类似对象的功能,例如方法。在幕后,相关包装类型的对象被创建然后销毁,这就是为什么您可以调用原始值的方法,例如:
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 运算符的 String、Number 和 Boolean 的使用。因此,它会在看到 new String、new Number 或 new 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();
# 何时不使用
如果您想允许使用原始包装对象,那么您可以安全地禁用此规则。
