版本

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"。第二個問題與布林物件有關。每個物件都是 truthy,這表示即使 Boolean 實例的實際值為 false,它始終會解析為 true

基於這些原因,避免使用 new 運算子搭配原始包裝器型別被認為是最佳實務。

規則詳情

此規則旨在消除對 StringNumberBoolean 使用 new 運算子的情況。因此,每當看到 new Stringnew Numbernew Boolean 時,它都會發出警告。

此規則的 錯誤 程式碼範例

在 Playground 中開啟
/*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;

此規則的 正確 程式碼範例

在 Playground 中開啟
/*eslint no-new-wrappers: "error"*/

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

var object = new MyString();

何時不該使用

如果您想要允許使用原始包裝器物件,則可以安全地停用此規則。

版本

此規則在 ESLint v0.0.6 中引入。

延伸閱讀

資源

變更語言