版本

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 中引入的。

延伸閱讀

資源

變更語言