筆者花了一個下午的時間把 ESLint 推薦的 rules 進行了總結。把官網rules打勾的部分寫成了
MD
文檔,並把每一個 rules 裏面的說明和示例也搞出來放一塊兒了。在這裏把它貢獻出來。javascript
博客維護在github上,歡迎給一個star!!!java
我的小站 => huangmiantong.cn禁止與 -0 進行比較node
Rule Detailsgit
該規則對試圖與 -0 進行比較的代碼發出警告,由於並不會達到預期。也就是說像 x === -0 的代碼對於 +0 和 -0 都有效。做者可能想要用 Object.is(x, -0)。es6
錯誤 代碼示例:github
if (x === -0) {
// doSomething()...
}
複製代碼
正確 代碼示例:正則表達式
if (x === 0) {
//a doSomething()...
}
複製代碼
if (Object.is(x, -0)) {
// doSomething()...
}
複製代碼
禁止條件表達式中出現賦值操做符express
Rule Detailsjson
該規則禁止在 if、for、while 和 do...while 語句中出現模棱兩可的賦值操做符。數組
options
該規則有一個字符串選項:
默認選項 "except-parens" 的 錯誤 代碼示例:
/*eslint no-cond-assign: "error"*/
// Unintentional assignment
var x;
if (x = 0) {
var b = 1;
}
// Practical example that is similar to an error
function setHeight(someNode) {
"use strict";
do {
someNode.height = "100px";
} while (someNode = someNode.parentNode);
}
複製代碼
默認選項 "except-parens" 的 正確 代碼示例:
/*eslint no-cond-assign: "error"*/
// Assignment replaced by comparison
var x;
if (x === 0) {
var b = 1;
}
// Practical example that wraps the assignment in parentheses
function setHeight(someNode) {
"use strict";
do {
someNode.height = "100px";
} while ((someNode = someNode.parentNode));
}
// Practical example that wraps the assignment and tests for 'null'
function setHeight(someNode) {
"use strict";
do {
someNode.height = "100px";
} while ((someNode = someNode.parentNode) !== null);
}
複製代碼
選項 "always" 的 錯誤 代碼示例:
/*eslint no-cond-assign: ["error", "always"]*/
// Unintentional assignment
var x;
if (x = 0) {
var b = 1;
}
// Practical example that is similar to an error
function setHeight(someNode) {
"use strict";
do {
someNode.height = "100px";
} while (someNode = someNode.parentNode);
}
// Practical example that wraps the assignment in parentheses
function setHeight(someNode) {
"use strict";
do {
someNode.height = "100px";
} while ((someNode = someNode.parentNode));
}
// Practical example that wraps the assignment and tests for 'null'
function setHeight(someNode) {
"use strict";
do {
someNode.height = "100px";
} while ((someNode = someNode.parentNode) !== null);
}
複製代碼
選項 "always" 的 正確 代碼示例:
/*eslint no-cond-assign: ["error", "always"]*/
// Assignment replaced by comparison
var x;
if (x === 0) {
var b = 1;
}
複製代碼
禁用 console
Rule Details
該規則禁止調用 console 對象的方法。
錯誤 代碼示例:
/*eslint no-console: "error"*/
console.log("Log a debug level message.");
console.warn("Log a warn level message.");
console.error("Log an error level message.");
複製代碼
正確 代碼示例:
/*eslint no-console: "error"*/
// custom console
Console.log("Hello world!");
複製代碼
options
該規則有例外狀況,是個對象:
選項 { "allow": ["warn", "error"] } 的 正確 代碼示例:
/*eslint no-console: ["error", { allow: ["warn", "error"] }] */
console.warn("Log a warn level message.");
console.error("Log an error level message.");
複製代碼
When Not To Use It
若是你在使用 Node.js,而後,console 主要用來向用戶輸出信息,因此不是嚴格用於調試目的。若是你正在作 Node.js 開發,那麼你極可能不想啓用此規則。
另外一個可能不使用此規則的狀況是,若是你想執行控制檯調用,而不是控制檯重寫。例如:
/*eslint no-console: ["error", { allow: ["warn"] }] */
console.error = function (message) {
throw new Error(message);
};
複製代碼
在上面使用 no-console 規則的示例中,ESLint 將報告一個錯誤。對於上面的例子,你能夠禁用該規則:
// eslint-disable-next-line no-console
console.error = function (message) {
throw new Error(message);
};
// or
console.error = function (message) { // eslint-disable-line no-console
throw new Error(message);
};
複製代碼
然而,你可能不但願手動添加 eslint-disable-next-line 或 eslint-disable-line。你可使用 no-restricted-syntax 規則來實現控制檯調用僅接收錯誤的效果:
{
"rules": {
"no-restricted-syntax": [
"error",
{
"selector": "CallExpression[callee.object.name='console'][callee.property.name=/^(log|warn|error|info|trace)$/]",
"message": "Unexpected property on console object was called"
}
]
}
}
複製代碼
禁止在條件中使用常量表達式
Rule Details
該規則禁止在如下語句的條件中出現常量表達式:
錯誤 代碼示例:
/*eslint no-constant-condition: "error"*/
if (false) {
doSomethingUnfinished();
}
if (void x) {
doSomethingUnfinished();
}
for (;-2;) {
doSomethingForever();
}
while (typeof x) {
doSomethingForever();
}
do {
doSomethingForever();
} while (x = -1);
var result = 0 ? a : b;
複製代碼
正確 代碼示例:
/*eslint no-constant-condition: "error"*/
if (x === 0) {
doSomething();
}
for (;;) {
doSomethingForever();
}
while (typeof x === "undefined") {
doSomething();
}
do {
doSomething();
} while (x);
var result = x !== 0 ? a : b;
複製代碼
options
checkLoops
默認爲 true。設置該選項爲 false 容許在循環中使用常量表達式。
當 checkLoops 爲 false 時的 正確 代碼示例:
/*eslint no-constant-condition: ["error", { "checkLoops": false }]*/
while (true) {
doSomething();
if (condition()) {
break;
}
};
for (;true;) {
doSomething();
if (condition()) {
break;
}
};
do {
doSomething();
if (condition()) {
break;
}
} while (true)
複製代碼
禁止在正則表達式中使用控制字符
Rule Details
該規則禁止在正則表達式中出現控制字符。
錯誤 代碼示例:
/*eslint no-control-regex: "error"*/
var pattern1 = /\x1f/;
var pattern2 = new RegExp("\x1f");
複製代碼
正確 代碼示例:
/*eslint no-control-regex: "error"*/
var pattern1 = /\x20/;
var pattern2 = new RegExp("\x20");
複製代碼
When Not To Use It
若是你須要使用控制字符進行模式匹配,你應該關閉該規則。
禁用 debugger
Rule Details
該規則禁止 debugger 語句。
錯誤 代碼示例:
/*eslint no-debugger: "error"*/
function isTruthy(x) {
debugger;
return Boolean(x);
}
複製代碼
正確 代碼示例:
/*eslint no-debugger: "error"*/
function isTruthy(x) {
return Boolean(x); // set a breakpoint at this line
}
複製代碼
When Not To Use It
若是你的代碼在很大程度上仍處於開發階段,不想擔憂剝離 debugger 語句,那麼就關閉此規則。一般在部署測試代碼以前,你會想從新開啓此規則。
禁止 function 定義中出現重名參數
Rule Details
該規則禁止在函數定義或表達中出現重名參數。該規則並不適用於箭頭函數或類方法,由於解析器會報告這樣的錯誤。
若是 ESLint 在嚴格模式下解析代碼,解析器(不是該規則)將報告這樣的錯誤。
錯誤 代碼示例:
/*eslint no-dupe-args: "error"*/
function foo(a, b, a) {
console.log("value of the second a:", a);
}
var bar = function (a, b, a) {
console.log("value of the second a:", a);
};
複製代碼
正確 代碼示例:
/*eslint no-dupe-args: "error"*/
function foo(a, b, c) {
console.log(a, b, c);
}
var bar = function (a, b, c) {
console.log(a, b, c);
};
複製代碼
禁止對象字面量中出現重複的 key
Rule Details
該規則禁止在對象字面量中出現重複的鍵。
錯誤 代碼示例:
/*eslint no-dupe-keys: "error"*/
var foo = {
bar: "baz",
bar: "qux"
};
var foo = {
"bar": "baz",
bar: "qux"
};
var foo = {
0x1: "baz",
1: "qux"
};
複製代碼
正確 代碼示例:
/*eslint no-dupe-keys: "error"*/
var foo = {
bar: "baz",
quxx: "qux"
};
複製代碼
禁止出現重複的 case 標籤
Rule Details
該規則禁止在 switch 語句中的 case 子句中出現重複的測試表達式。
錯誤 代碼示例:
/*eslint no-duplicate-case: "error"*/
var a = 1,
one = 1;
switch (a) {
case 1:
break;
case 2:
break;
case 1: // duplicate test expression
break;
default:
break;
}
switch (a) {
case one:
break;
case 2:
break;
case one: // duplicate test expression
break;
default:
break;
}
switch (a) {
case "1":
break;
case "2":
break;
case "1": // duplicate test expression
break;
default:
break;
}
複製代碼
正確 代碼示例:
/*eslint no-duplicate-case: "error"*/
var a = 1,
one = 1;
switch (a) {
case 1:
break;
case 2:
break;
case 3:
break;
default:
break;
}
switch (a) {
case one:
break;
case 2:
break;
case 3:
break;
default:
break;
}
switch (a) {
case "1":
break;
case "2":
break;
case "3":
break;
default:
break;
}
複製代碼
禁止出現空語句塊
Rule Details
該規則禁止空語句塊出現。該規則忽略包含一個註釋的語句塊(例如,在 try 語句中,一個空的 catch 或 finally 語句塊意味着程序應該繼續執行,不管是否出現錯誤)。
錯誤 代碼示例:
/*eslint no-empty: "error"*/
if (foo) {
}
while (foo) {
}
switch(foo) {
}
try {
doSomething();
} catch(ex) {
} finally {
}
複製代碼
正確 代碼示例:
/*eslint no-empty: "error"*/
if (foo) {
// empty
}
while (foo) {
/* empty */
}
try {
doSomething();
} catch (ex) {
// continue regardless of error
}
try {
doSomething();
} finally {
/* continue regardless of error */
}
複製代碼
Options
該規則有例外狀況,是個對象:
allowEmptyCatch
選項 { "allowEmptyCatch": true } 的 正確 代碼示例:
/* eslint no-empty: ["error", { "allowEmptyCatch": true }] */
try {
doSomething();
} catch (ex) {}
try {
doSomething();
}
catch (ex) {}
finally {
/* continue regardless of error */
}
複製代碼
When Not To Use It
若是你打算使用空語句塊,那麼你能夠禁用此規則。
禁止在正則表達式中使用空字符集
Rule Details
該規則禁止在正則表達式中出現空字符集。
錯誤 代碼示例:
/*eslint no-empty-character-class: "error"*/
/^abc[]/.test("abcdefg"); // false
"abcdefg".match(/^abc[]/); // null
複製代碼
正確 代碼示例:
/*eslint no-empty-character-class: "error"*/
/^abc/.test("abcdefg"); // true
"abcdefg".match(/^abc/); // ["abc"]
/^abc[a-z]/.test("abcdefg"); // true
"abcdefg".match(/^abc[a-z]/); // ["abcd"]
複製代碼
Known Limitations
該規則不會報告 RegExp 構造函數的字符串參數中空字符集的使用狀況。
當該規則報告了正確代碼時,漏報的示例:
/*eslint no-empty-character-class: "error"*/
var abcNeverMatches = new RegExp("^abc[]");
複製代碼
禁止對 catch 子句的參數從新賦值
Rule Details
該規則禁止對 catch 子句中的異常從新賦值。
錯誤 代碼示例:
/*eslint no-ex-assign: "error"*/
try {
// code
} catch (e) {
e = 10;
}
複製代碼
正確 代碼示例:
/*eslint no-ex-assign: "error"*/
try {
// code
} catch (e) {
var foo = 10;
}
複製代碼
Further Reading
禁止沒必要要的布爾轉換
Rule Details
該規則禁止沒必要要的布爾類型轉換。
錯誤 代碼示例:
/*eslint no-extra-boolean-cast: "error"*/
var foo = !!!bar;
var foo = !!bar ? baz : bat;
var foo = Boolean(!!bar);
var foo = new Boolean(!!bar);
if (!!foo) {
// ...
}
if (Boolean(foo)) {
// ...
}
while (!!foo) {
// ...
}
do {
// ...
} while (Boolean(foo));
for (; !!foo; ) {
// ...
}
複製代碼
正確 代碼示例:
/*eslint no-extra-boolean-cast: "error"*/
var foo = !!bar;
var foo = Boolean(bar);
function foo() {
return !!bar;
}
var foo = bar ? !!baz : !!bat;
複製代碼
禁止沒必要要的分號
Rule Details
該規則禁用沒必要要的分號。
錯誤 代碼示例:
/*eslint no-extra-semi: "error"*/
var x = 5;;
function foo() {
// code
};
複製代碼
正確 代碼示例:
/*eslint no-extra-semi: "error"*/
var x = 5;
var foo = function() {
// code
};
複製代碼
When Not To Use It
若是你有意使用額外的分號,那麼你能夠禁用此規則。
禁止對 function 聲明從新賦值
Rule Details
該規則禁止對 function 聲明從新賦值。
錯誤 代碼示例:
/*eslint no-func-assign: "error"*/
function foo() {}
foo = bar;
function foo() {
foo = bar;
}
複製代碼
與 JSHint 中對應的規則不一樣,該規則的 錯誤 代碼示例:
/*eslint no-func-assign: "error"*/
foo = bar;
function foo() {}
複製代碼
正確 代碼示例:
/*eslint no-func-assign: "error"*/
var foo = function () {}
foo = bar;
function foo(foo) { // `foo` is shadowed.
foo = bar;
}
function foo() {
var foo = bar; // `foo` is shadowed.
}
複製代碼
禁止在嵌套的塊中出現變量聲明或 function 聲明
Rule Details
該規則要求函數聲明和變量聲明(可選的)在程序或函數體的頂部。
Options
該規則有一個字符串選項:
functions
默認選項 "functions" 的 錯誤 代碼示例:
/*eslint no-inner-declarations: "error"*/
if (test) {
function doSomething() { }
}
function doSomethingElse() {
if (test) {
function doAnotherThing() { }
}
}
複製代碼
默認選項 "functions" 的 正確 代碼示例:
/*eslint no-inner-declarations: "error"*/
function doSomething() { }
function doSomethingElse() {
function doAnotherThing() { }
}
if (test) {
asyncCall(id, function (err, data) { });
}
var fn;
if (test) {
fn = function fnExpression() { };
}
複製代碼
both
選項 "both" 的 錯誤 代碼示例:
/*eslint no-inner-declarations: ["error", "both"]*/
if (test) {
var foo = 42;
}
function doAnotherThing() {
if (test) {
var bar = 81;
}
}
複製代碼
選項 "both" 的 正確 代碼示例:
/*eslint no-inner-declarations: "error"*/
/*eslint-env es6*/
var bar = 42;
if (test) {
let baz = 43;
}
function doAnotherThing() {
var baz = 81;
}
複製代碼
When Not To Use It
當 block-scoped functions 出如今 ES6 中時,函數聲明的部分規則將被廢棄,但在那以前,它應該是行之有效的。當使用 block-scoped-var 規則時或者在嵌套塊中聲明變量是能夠接受的(儘管有變量聲明提高)時候,能夠再也不檢測變量聲明。
禁止 RegExp 構造函數中存在無效的正則表達式字符串
Rule Details
該規則禁止在 RegExp 構造函數中出現無效的正則表達式。
錯誤 代碼示例:
/*eslint no-invalid-regexp: "error"*/
RegExp('[')
RegExp('.', 'z')
new RegExp('\\')
複製代碼
正確 代碼示例:
/*eslint no-invalid-regexp: "error"*/
RegExp('.')
new RegExp
this.RegExp('[')
複製代碼
Environments
ECMAScript 6 爲 RegExp 構造函數增長了如下標誌參數:
若是你想容許使用額外的標誌,也不論出於什麼目的,你能夠在 .eslintrc 使用 allowConstructorFlags 選項指定它們。這樣,不論是否有 ecmaVersion 設置,這些標記將會被該規則忽略。
Options
該規則有例外狀況,是個對象:
allowConstructorFlags
選項 { "allowConstructorFlags": ["u", "y"] } 的 正確 代碼示例:
/*eslint no-invalid-regexp: ["error", { "allowConstructorFlags": ["u", "y"] }]*/
new RegExp('.', 'y')
new RegExp('.', 'yu')
複製代碼
Further Reading
禁止在字符串和註釋以外不規則的空白
Rule Details
該規則旨在捕獲無效的不是正常的tab和空格的空白。這些字符有的會在現代瀏覽器中引起問題,其它的會引發調試問題。
該規則禁止出現如下字符,除非該規則選項容許:
\u000B - Line Tabulation (\v) - <VT>
\u000C - Form Feed (\f) - <FF>
\u00A0 - No-Break Space - <NBSP>
\u0085 - Next Line
\u1680 - Ogham Space Mark
\u180E - Mongolian Vowel Separator - <MVS>
\ufeff - Zero Width No-Break Space - <BOM>
\u2000 - En Quad
\u2001 - Em Quad
\u2002 - En Space - <ENSP>
\u2003 - Em Space - <EMSP>
\u2004 - Tree-Per-Em
\u2005 - Four-Per-Em
\u2006 - Six-Per-Em
\u2007 - Figure Space
\u2008 - Punctuation Space - <PUNCSP>
\u2009 - Thin Space
\u200A - Hair Space
\u200B - Zero Width Space - <ZWSP>
\u2028 - Line Separator
\u2029 - Paragraph Separator
\u202F - Narrow No-Break Space
\u205f - Medium Mathematical Space
\u3000 - Ideographic Space
複製代碼
Options
該規則有例外狀況,是個對象:
skipStrings
默認選項 { "skipStrings": true } 的 錯誤 代碼示例:
/*eslint no-irregular-whitespace: "error"*/
function thing() /*<NBSP>*/{
return 'test';
}
function thing( /*<NBSP>*/){
return 'test';
}
function thing /*<NBSP>*/(){
return 'test';
}
function thing/*<MVS>*/(){
return 'test';
}
function thing() {
return 'test'; /*<ENSP>*/
}
function thing() {
return 'test'; /*<NBSP>*/
}
function thing() {
// Description <NBSP>: some descriptive text
}
/* Description <NBSP>: some descriptive text */
function thing() {
return / <NBSP>regexp/;
}
/*eslint-env es6*/
function thing() {
return `template <NBSP>string`;
}
複製代碼
默認選項 { "skipStrings": true } 正確 代碼示例:
/*eslint no-irregular-whitespace: "error"*/
function thing() {
return ' <NBSP>thing';
}
function thing() {
return '<ZWSP>thing';
}
function thing() {
return 'th <NBSP>ing';
}
複製代碼
skipComments
選項 { "skipComments": true } 的 正確 代碼示例:
/*eslint no-irregular-whitespace: ["error", { "skipComments": true }]*/
function thing() {
// Description <NBSP>: some descriptive text
}
/* Description <NBSP>: some descriptive text */
複製代碼
skipRegExps
選項 { "skipRegExps": true } 的 正確 代碼示例:
/*eslint no-irregular-whitespace: ["error", { "skipRegExps": true }]*/
function thing() {
return / <NBSP>regexp/;
}
複製代碼
skipTemplates
選項 { "skipTemplates": true } 的 正確 代碼示例:
/*eslint no-irregular-whitespace: ["error", { "skipTemplates": true }]*/
/*eslint-env es6*/
function thing() {
return `template <NBSP>string`;
}
複製代碼
When Not To Use It
若是你想在你的應用中使用 tab 和空格以外的空白字符,能夠關閉此規則。
禁止把全局對象做爲函數調用
Rule Details
該規則禁止將 Math、JSON 和 Reflect 對象看成函數進行調用。
錯誤 代碼示例:
/*eslint no-obj-calls: "error"*/
var math = Math();
var json = JSON();
var reflect = Reflect();
複製代碼
正確 代碼示例:
/*eslint no-obj-calls: "error"*/
function area(r) {
return Math.PI * r * r;
}
var object = JSON.parse("{}");
var value = Reflect.get({ x: 1, y: 2 }, "x");
複製代碼
禁止正則表達式字面量中出現多個空格
Rule Details
該規則禁止在正則表達式字面量中出現多個空格。
錯誤 代碼示例:
/*eslint no-regex-spaces: "error"*/
var re = /foo bar/;
var re = new RegExp("foo bar");
複製代碼
正確 代碼示例:
/*eslint no-regex-spaces: "error"*/
var re = /foo {3}bar/;
var re = new RegExp("foo {3}bar");
複製代碼
禁用稀疏數組
Rule Details
該規則禁止使用稀疏數組,也就是逗號以前沒有任何元素的數組。該規則不適用於緊隨最後一個元素的拖尾逗號的狀況。
錯誤 代碼示例:
/*eslint no-sparse-arrays: "error"*/
var items = [,];
var colors = [ "red",, "blue" ];
複製代碼
正確 代碼示例:
/*eslint no-sparse-arrays: "error"*/
var items = [];
var items = new Array(23);
// trailing comma (after the last element) is not a problem
var colors = [ "red", "blue", ];
複製代碼
禁止出現使人困惑的多行表達式
Rule Details
該規則禁止使用使人困惑的多行表達式。
錯誤 代碼示例:
/*eslint no-unexpected-multiline: "error"*/
var foo = bar
(1 || 2).baz();
var hello = 'world'
[1, 2, 3].forEach(addNumber);
let x = function() {}
`hello`
let x = function() {}
x
`hello`
let x = foo
/regex/g.test(bar)
複製代碼
正確 代碼示例:
/*eslint no-unexpected-multiline: "error"*/
var foo = bar;
(1 || 2).baz();
var foo = bar
;(1 || 2).baz()
var hello = 'world';
[1, 2, 3].forEach(addNumber);
var hello = 'world'
void [1, 2, 3].forEach(addNumber);
let x = function() {};
`hello`
let tag = function() {}
tag `hello`
複製代碼
禁止在return、throw、continue 和 break 語句以後出現不可達代碼
Rule Details
該規則禁止在 return、throw、continue 和 break 語句後出現不可達代碼。
錯誤 代碼示例:
/*eslint no-unreachable: "error"*/
function foo() {
return true;
console.log("done");
}
function bar() {
throw new Error("Oops!");
console.log("done");
}
while(value) {
break;
console.log("done");
}
throw new Error("Oops!");
console.log("done");
function baz() {
if (Math.random() < 0.5) {
return;
} else {
throw new Error();
}
console.log("done");
}
for (;;) {}
console.log("done");
複製代碼
正確 代碼示例,由於 JavaScript 函數和變量提高:
/*eslint no-unreachable: "error"*/
function foo() {
return bar();
function bar() {
return 1;
}
}
function bar() {
return x;
var x;
}
switch (foo) {
case 1:
break;
var x;
}
複製代碼
禁止在 finally 語句塊中出現控制流語句
Rule Details
該規則禁止在 finally 語句塊中出現 return、throw、break 和 continue 語句。它容許間接使用,好比在 function 或 class 的定義中。
錯誤 代碼示例:
/*eslint no-unsafe-finally: "error"*/
let foo = function() {
try {
return 1;
} catch(err) {
return 2;
} finally {
return 3;
}
};
複製代碼
/*eslint no-unsafe-finally: "error"*/
let foo = function() {
try {
return 1;
} catch(err) {
return 2;
} finally {
throw new Error;
}
};
複製代碼
正確 代碼示例:
/*eslint no-unsafe-finally: "error"*/
let foo = function() {
try {
return 1;
} catch(err) {
return 2;
} finally {
console.log("hola!");
}
};
複製代碼
/*eslint no-unsafe-finally: "error"*/
let foo = function() {
try {
return 1;
} catch(err) {
return 2;
} finally {
let a = function() {
return "hola!";
}
}
};
複製代碼
/*eslint no-unsafe-finally: "error"*/
let foo = function(a) {
try {
return 1;
} catch(err) {
return 2;
} finally {
switch(a) {
case 1: {
console.log("hola!")
break;
}
}
}
};
複製代碼
禁止對關係運算符的左操做數使用否認操做符
Rule Details
該規則禁止對關係運算符的左操做數使用否認操做符。
關係運算符有:
錯誤 代碼示例:
/*eslint no-unsafe-negation: "error"*/
if (!key in object) {
// operator precedence makes it equivalent to (!key) in object
// and type conversion makes it equivalent to (key ? "false" : "true") in object
}
if (!obj instanceof Ctor) {
// operator precedence makes it equivalent to (!obj) instanceof Ctor
// and it equivalent to always false since boolean values are not objects.
}
複製代碼
正確 代碼示例:
/*eslint no-unsafe-negation: "error"*/
if (!(key in object)) {
// key is not in object
}
if (!(obj instanceof Ctor)) {
// obj is not an instance of Ctor
}
if(("" + !key) in object) {
// make operator precedence and type conversion explicit
// in a rare situation when that is the intended meaning
}
複製代碼
Options 無。
該規則禁止與 ‘NaN’ 的比較。
Rule Details
該規則禁止在正則表達式字面量中出現多個空格。
錯誤 代碼示例:
/*eslint use-isnan: "error"*/
if (foo == NaN) {
// ...
}
if (foo != NaN) {
// ...
}
複製代碼
正確 代碼示例:
/*eslint use-isnan: "error"*/
if (isNaN(foo)) {
// ...
}
if (!isNaN(foo)) {
// ...
}
複製代碼
強制 typeof 表達式與有效的字符串進行比較
Rule Details
該規則強制 typeof 表達式與有效的字符串進行比較。
Options
該規則有一個對象選項:
錯誤 代碼示例:
/*eslint valid-typeof: "error"*/
typeof foo === "strnig"
typeof foo == "undefimed"
typeof bar != "nunber"
typeof bar !== "function"
複製代碼
正確 代碼示例:
/*eslint valid-typeof: "error"*/
typeof foo === "string"
typeof bar == "undefined"
typeof foo === baz
typeof bar === typeof qux
複製代碼
選項 { "requireStringLiterals": true } 的 錯誤 代碼示例:
typeof foo === undefined
typeof bar == Object
typeof baz === "strnig"
typeof qux === "some invalid type"
typeof baz === anotherVariable
typeof foo == 5
複製代碼
選項 { "requireStringLiterals": true } 的 正確 代碼示例:
typeof foo === "undefined"
typeof bar == "object"
typeof baz === "string"
typeof bar === typeof qux
複製代碼
不容許在 case 子句中使用詞法聲明
Rule Details
該規則旨在避免訪問未經初始化的詞法綁定以及跨 case 語句訪問被提高的函數。
錯誤 代碼示例:
/*eslint no-case-declarations: "error"*/
/*eslint-env es6*/
switch (foo) {
case 1:
let x = 1;
break;
case 2:
const y = 2;
break;
case 3:
function f() {}
break;
default:
class C {}
}
複製代碼
正確 代碼示例:
/*eslint no-case-declarations: "error"*/
/*eslint-env es6*/
// Declarations outside switch-statements are valid
const a = 0;
switch (foo) {
// The following case clauses are wrapped into blocks using brackets
case 1: {
let x = 1;
break;
}
case 2: {
const y = 2;
break;
}
case 3: {
function f() {}
break;
}
case 4:
// Declarations using var without brackets are valid due to function-scope hoisting
var z = 4;
break;
default: {
class C {}
}
}
複製代碼
禁止使用空解構模式
Rule Details
此規則目的在於標記出在解構對象和數組中的任何的空模式,每當遇到一個這樣的空模式,該規則就會報告一個問題。
錯誤 代碼示例:
/*eslint no-empty-pattern: "error"*/
var {} = foo;
var [] = foo;
var {a: {}} = foo;
var {a: []} = foo;
function foo({}) {}
function foo([]) {}
function foo({a: {}}) {}
function foo({a: []}) {}
複製代碼
正確 代碼示例:
/*eslint no-empty-pattern: "error"*/
var {a = {}} = foo;
var {a = []} = foo;
function foo({a = {}}) {}
function foo({a = []}) {}
複製代碼
禁止 case 語句落空
Rule Details
該規則旨在消除非故意 case 落空行爲。所以,它會標記處沒有使用註釋標明的落空狀況。
錯誤 代碼示例:
/*eslint no-fallthrough: "error"*/
switch(foo) {
case 1:
doSomething();
case 2:
doSomething();
}
複製代碼
正確 代碼示例:
/*eslint no-fallthrough: "error"*/
switch(foo) {
case 1:
doSomething();
break;
case 2:
doSomething();
}
function bar(foo) {
switch(foo) {
case 1:
doSomething();
return;
case 2:
doSomething();
}
}
switch(foo) {
case 1:
doSomething();
throw new Error("Boo!");
case 2:
doSomething();
}
switch(foo) {
case 1:
case 2:
doSomething();
}
switch(foo) {
case 1:
doSomething();
// falls through
case 2:
doSomething();
}
複製代碼
注意,在上面的例子中,最後的 case 語句,不會引發警告,由於沒有可落空的語句了。
Options
該規則接受單個選項參數:
commentPattern
選項 { "commentPattern": "break[\s\w]*omitted" } 的 正確 代碼示例:
/*eslint no-fallthrough: ["error", { "commentPattern": "break[\\s\\w]*omitted" }]*/
switch(foo) {
case 1:
doSomething();
// break omitted
case 2:
doSomething();
}
switch(foo) {
case 1:
doSomething();
// caution: break is omitted intentionally
default:
doSomething();
}
複製代碼
禁止對原生對象或只讀的全局對象進行賦值
Rule Details
該規則禁止修改只讀的全局變量。
ESLint 能夠配置全局變量爲只讀。
錯誤 代碼示例:
/*eslint no-global-assign: "error"*/
Object = null
undefined = 1
複製代碼
/*eslint no-global-assign: "error"*/
/*eslint-env browser*/
window = {}
length = 1
top = 1
複製代碼
/*eslint no-global-assign: "error"*/
/*globals a:false*/
a = 1
複製代碼
正確 代碼示例:
/*eslint no-global-assign: "error"*/
a = 1
var b = 1
b = 2
複製代碼
/*eslint no-global-assign: "error"*/
/*eslint-env browser*/
onload = function() {}
複製代碼
/*eslint no-global-assign: "error"*/
/*globals a:true*/
a = 1
複製代碼
Options
該規則接受一個 exceptions 選項,能夠用來指定容許進行賦值的內置對象列表:
{
"rules": {
"no-global-assign": ["error", {"exceptions": ["Object"]}]
}
}
複製代碼
禁用八進制字面量
Rule Details
該規則禁用八進制字面量。
若是 ESLint 是在嚴格模式下解析代碼,解析器(而不是該規則)會報告錯誤。
錯誤 代碼示例:
/*eslint no-octal: "error"*/
var num = 071;
var result = 5 + 07;
複製代碼
正確 代碼示例:
/*eslint no-octal: "error"*/
var num = "071";
複製代碼
禁止屢次聲明同一變量
Rule Details
此規則目旨在消除同一做用域中屢次聲明同一變量。
錯誤 代碼示例:
/*eslint no-redeclare: "error"*/
var a = 3;
var a = 10;
複製代碼
正確 代碼示例:
/*eslint no-redeclare: "error"*/
var a = 3;
// ...
a = 10;
複製代碼
Options
該規則有一個選項參數,是個對象,該對象有個布爾屬性爲 "builtinGlobals"。默認爲false。
若是設置爲 true,該規則也會檢查全局內建對象,好比Object、Array、Number…
builtinGlobals
"builtinGlobals" 選項將會在全局範圍檢查被從新聲明的內置全局變量。
選項 { "builtinGlobals": true } 的 錯誤 代碼示例:
/*eslint no-redeclare: ["error", { "builtinGlobals": true }]*/
var Object = 0;
複製代碼
在 browser 環境下,選項 {"builtinGlobals": true} 的 錯誤 代碼示例:
/*eslint no-redeclare: ["error", { "builtinGlobals": true }]*/
/*eslint-env browser*/
var top = 0;
複製代碼
browser 環境有不少內建的全局變量(例如,top)。一些內建的全局變量不能被從新聲明。
注意,當使用 node 或 commonjs 環境 (或 ecmaFeatures.globalReturn,若是使用默認解析器)時,則程序的最大做用域不是實際的全局做用域,而是一個模塊做用域。當出現這種狀況時,聲明一個之內置的全局變量命令的變量,不算是重聲明,只是遮蔽了全局變量。在這種狀況下,應該使用 no-shadow 規則的 "builtinGlobals" 選項。
禁止自我賦值
Rule Details
該規則旨在消除自身賦值的狀況。
錯誤 代碼示例:
/*eslint no-self-assign: "error"*/
foo = foo;
[a, b] = [a, b];
[a, ...b] = [x, ...b];
({a, b} = {a, x});
複製代碼
正確 代碼示例:
/*eslint no-self-assign: "error"*/
foo = bar;
[a, b] = [b, a];
// This pattern is warned by the `no-use-before-define` rule.
let foo = foo;
// The default values have an effect.
[foo = 1] = [foo];
複製代碼
Options
該規則也有能夠檢查屬性的選項。
{
"no-self-assign": ["error", {"props": false}]
}
複製代碼
props
選項 { "props": true } 的 錯誤 代碼示例:
/*eslint no-self-assign: [error, {props: true}]*/
// self-assignments with properties.
obj.a = obj.a;
obj.a.b = obj.a.b;
obj["a"] = obj["a"];
obj[a] = obj[a];
複製代碼
選項 { "props": true } 的 正確 代碼示例:
/*eslint no-self-assign: [error, {props: true}]*/
// non-self-assignments with properties.
obj.a = obj.b;
obj.a.b = obj.c.b;
obj.a.b = obj.a.c;
obj[a] = obj["a"]
// This ignores if there is a function call.
obj.a().b = obj.a().b
a().b = a().b
// Known limitation: this does not support computed properties except single literal or single identifier.
obj[a + b] = obj[a + b];
obj["a" + "b"] = obj["a" + "b"];
複製代碼
禁用出現未使用過的標
Rule Details
該規則旨在消除未使用過的標籤。
錯誤 代碼示例:
/*eslint no-unused-labels: "error"*/
A: var foo = 0;
B: {
foo();
}
C:
for (let i = 0; i < 10; ++i) {
foo();
}
複製代碼
正確 代碼示例:
/*eslint no-unused-labels: "error"*/
A: {
if (foo()) {
break A;
}
bar();
}
B:
for (let i = 0; i < 10; ++i) {
if (foo()) {
break B;
}
bar();
}
複製代碼
禁用沒必要要的轉義字符
Rule Details
該規則標記在不改變代碼行爲的狀況下能夠安全移除的轉義。
錯誤 代碼示例:
/*eslint no-useless-escape: "error"*/
"\'";
'\"';
"\#";
"\e";
`\"`;
`\"${foo}\"`;
`\#{foo}`;
/\!/;
/\@/;
複製代碼
正確 代碼示例:
/*eslint no-useless-escape: "error"*/
"\"";
'\'';
"\x12";
"\u00a9";
"\371";
"xs\u2111";
`\``;
`\${${foo}}`;
`$\{${foo}}`;
/\\/g;
/\t/g;
/\w\$\*\^\./;
複製代碼
禁用沒必要要的轉義字符
Rule Details
該規則禁止對變量使用 delete 操做符。
若是 ESLint 是在嚴格模式下解析代碼,解析器(而不是該規則)會報告錯誤。
錯誤 代碼示例:
/*eslint no-delete-var: "error"*/
var x;
delete x;
複製代碼
禁用未聲明的變量,除非它們在 /*global */ 註釋中被提到
Rule Details
對任何未聲明的變量的引用都會引發一個警告,除非顯式地在 /global .../ 註釋中指定,或在 globals key in the configuration file 中指定。另外一個常見的用例是,你有意使用定義在其餘地方的全局變量(例如來自 HTML 的腳本)。
錯誤 代碼示例:
/*eslint no-undef: "error"*/
var a = someFunction();
b = 10;
複製代碼
有 global 聲明時,該規則的 正確 代碼示例:
/*global someFunction b:true*/
/*eslint no-undef: "error"*/
var a = someFunction();
b = 10;
複製代碼
有 global 聲明時,該規則的 錯誤 代碼示例:
/*global b*/
/*eslint no-undef: "error"*/
b = 10;
複製代碼
默認狀況下,/*global */ 中聲明的變量是隻讀的,所以對其進行賦值是錯誤的。
Options
typeof
默認選項 { "typeof": false } 的 正確 代碼示例:
/*eslint no-undef: "error"*/
if (typeof UndefinedIdentifier === "undefined") {
// do something ...
}
複製代碼
若是想阻止在 typeof 運算中有未申明的變量致使的警告,能夠用此項。
選項 { "typeof": true } 的 錯誤 代碼示例:
/*eslint no-undef: ["error", { "typeof": true }] */
if(typeof a === "string"){}
複製代碼
有 global 聲明時,選項 { "typeof": true } 的 正確 代碼示例:
/*global a*/
/*eslint no-undef: ["error", { "typeof": true }] */
if(typeof a === "string"){}
複製代碼
Environments
爲了方便,ESlint 提供了預約義流行類庫和運行時環境暴露的全局變量的快捷方式。該規則支持這些環境,如 指定 Environments 中列出的。使用以下:
browser
browser 環境下的 正確 代碼示例:
/*eslint no-undef: "error"*/
/*eslint-env browser*/
setTimeout(function() {
alert("Hello");
});
複製代碼
Node.js
node 環境下的 正確 代碼示例:
/*eslint no-undef: "error"*/
/*eslint-env node*/
var fs = require("fs");
module.exports = function() {
console.log(fs);
};
複製代碼
禁止出現未使用過的變量
Rule Details
此規則旨在消除未使用過的變量,方法和方法中的參數名,當發現這些存在,發出警告。
符合下面條件的變量被認爲是可使用的:
一個變量僅僅是被賦值爲 (var x = 5) 或者是被聲明過,則認爲它是沒被考慮使用。
錯誤 代碼示例:
/*eslint no-unused-vars: "error"*/
/*global some_unused_var*/
// It checks variables you have defined as global
some_unused_var = 42;
var x;
// Write-only variables are not considered as used.
var y = 10;
y = 5;
// A read for a modification of itself is not considered as used.
var z = 0;
z = z + 1;
// By default, unused arguments cause warnings.
(function(foo) {
return 5;
})();
// Unused recursive functions also cause warnings.
function fact(n) {
if (n < 2) return 1;
return n * fact(n - 1);
}
// When a function definition destructures an array, unused entries from the array also cause warnings.
function getY([x, y]) {
return y;
}
複製代碼
正確 代碼示例:
/*eslint no-unused-vars: "error"*/
var x = 10;
alert(x);
// foo is considered used here
myFunc(function foo() {
// ...
}.bind(this));
(function(foo) {
return foo;
})();
var myFunc;
myFunc = setTimeout(function() {
// myFunc is considered used
myFunc();
}, 50);
// Only the second argument from the descructured array is used.
function getY([, y]) {
return y;
}
複製代碼
exported
在 CommonJS 或者 ECMAScript 模塊外部,可用 var建立一個被其餘模塊代碼引用的變量。你也能夠用 /* exported variableName */ 註釋快代表此變量已導出,所以此變量不會被認爲是未被使用過的。
須要注意的是 /* exported */ 在下列狀況下是無效的:
行註釋 // exported variableName 將不起做用,由於 exported 不是特定於行的。
選項 /* exported variableName */ 的 正確 代碼示例:
/* exported global_var */
var global_var = 42;
複製代碼
Options
該規則接受一個字符串或者對像類型的參數。字符串設置正如同 vars 同樣(以下所示)。
配置項的默認值,變量選項是 all,參數的選項是 after-used 。
{
"rules": {
"no-unused-vars": ["error", { "vars": "all", "args": "after-used", "ignoreRestSiblings": false }]
}
}
複製代碼
vars
此配置項有兩個值:
vars: local
選項 { "vars": "local" } 的 正確 代碼示例:
/*eslint no-unused-vars: ["error", { "vars": "local" }]*/
/*global some_unused_var */
some_unused_var = 42;
複製代碼
varsIgnorePattern
這個 varsIgnorePattern 選項指定了不須要檢測的異常:變量名稱匹配正則模式。例如,變量的名字包含 ignored 或者 Ignored。
選項 { "varsIgnorePattern": "[iI]gnored" } 的 正確 代碼示例:
/*eslint no-unused-vars: ["error", { "varsIgnorePattern": "[iI]gnored" }]*/
var firstVarIgnored = 1;
var secondVar = 2;
console.log(secondVar);
複製代碼
args
args 選項有三個值:
args: after-used
選項 { "args": "after-used" } 的 錯誤 代碼示例:
/*eslint no-unused-vars: ["error", { "args": "after-used" }]*/
// 1 error
// "baz" is defined but never used
(function(foo, bar, baz) {
return bar;
})();
複製代碼
選項 { "args": "after-used" } 的 正確 代碼示例:
/*eslint no-unused-vars: ["error", {"args": "after-used"}]*/
(function(foo, bar, baz) {
return baz;
})();
複製代碼
args: all
選項 { "args": "all" } 的 錯誤 代碼示例:
/*eslint no-unused-vars: ["error", { "args": "all" }]*/
// 2 errors
// "foo" is defined but never used
// "baz" is defined but never used
(function(foo, bar, baz) {
return bar;
})();
複製代碼
args: none
選項 { "args": "none" } 的 正確 代碼示例:
/*eslint no-unused-vars: ["error", { "args": "none" }]*/
(function(foo, bar, baz) {
return bar;
})();
複製代碼
ignoreRestSiblings
ignoreRestSiblings 選項是個布爾類型 (默認: false)。使用 Rest 屬性 可能會「省略」對象中的屬性,可是默認狀況下,其兄弟屬性被標記爲 「unused」。使用該選項可使 rest 屬性的兄弟屬性被忽略。
選項 { "ignoreRestSiblings": true } 的 正確 代碼示例:
/*eslint no-unused-vars: ["error", { "ignoreRestSiblings": true }]*/
// 'type' is ignored because it has a rest property sibling.
var { type, ...coords } = data;
複製代碼
argsIgnorePattern
argsIgnorePattern 選項指定排除不須要檢測:這些參數的名字符合正則匹配。例如,下劃線開頭的變量。
選項 { "argsIgnorePattern": "^_" } 的 正確 代碼示例:
/*eslint no-unused-vars: ["error", { "argsIgnorePattern": "^_" }]*/
function foo(x, _y) {
return x + 1;
}
foo();
複製代碼
caughtErrors
caughtErrors 選項被用來驗證 catch 塊的參數。
它有兩個設置:
caughtErrors: none 沒有指定該規則,至關於將它賦值爲 none。
選項 { "caughtErrors": "none" } 的 正確 代碼示例:
/*eslint no-unused-vars: ["error", { "caughtErrors": "none" }]*/
try {
//...
} catch (err) {
console.error("errors");
}
複製代碼
caughtErrors: all
選項 { "caughtErrors": "all" } 的 錯誤 代碼示例:
/*eslint no-unused-vars: ["error", { "caughtErrors": "all" }]*/
// 1 error
// "err" is defined but never used
try {
//...
} catch (err) {
console.error("errors");
}
複製代碼
caughtErrorsIgnorePattern
caughtErrorsIgnorePattern 選項指定例外狀況,不會檢查匹配正則表達式 catch 參數。例如,名字以 ‘ignore’ 開頭的變量。
選項 { "caughtErrorsIgnorePattern": "^ignore" } 的 正確 代碼示例:
/*eslint no-unused-vars: ["error", { "caughtErrorsIgnorePattern": "^ignore" }]*/
try {
//...
} catch (ignoreErr) {
console.error("errors");
}
複製代碼
禁止空格和 tab 的混合縮進
Rule Details
該規則禁止使用 空格 和 tab 混合縮進。
錯誤 代碼示例:
/*eslint no-mixed-spaces-and-tabs: "error"*/
function add(x, y) {
// --->..return x + y;
return x + y;
}
function main() {
// --->var x = 5,
// --->....y = 7;
var x = 5,
y = 7;
}
複製代碼
正確 代碼示例:
/*eslint no-mixed-spaces-and-tabs: "error"*/
function add(x, y) {
// --->return x + y;
return x + y;
}
複製代碼
Options
該規則有一個字符串選項。
smart-tabs
選項 "smart-tabs" 的 正確 代碼示例:
/*eslint no-mixed-spaces-and-tabs: ["error", "smart-tabs"]*/
function main() {
// --->var x = 5,
// --->....y = 7;
var x = 5,
y = 7;
}
複製代碼
要求在構造函數中有 super() 的調用
Rule Details
該規則旨在標記無效或缺失的 super() 調用。
錯誤 代碼示例:
/*eslint constructor-super: "error"*/
/*eslint-env es6*/
class A {
constructor() {
super(); // This is a SyntaxError.
}
}
class A extends B {
constructor() { } // Would throw a ReferenceError.
}
// Classes which inherits from a non constructor are always problems.
class A extends null {
constructor() {
super(); // Would throw a TypeError.
}
}
class A extends null {
constructor() { } // Would throw a ReferenceError.
}
複製代碼
正確 代碼示例:
/*eslint constructor-super: "error"*/
/*eslint-env es6*/
class A {
constructor() { }
}
class A extends B {
constructor() {
super();
}
}
複製代碼
禁止修改類聲明的變量
Rule Details
該規則旨在標記類聲明中變量的修改狀況。
錯誤 代碼示例:
/*eslint no-class-assign: "error"*/
/*eslint-env es6*/
class A { }
A = 0;
複製代碼
/*eslint no-class-assign: "error"*/
/*eslint-env es6*/
A = 0;
class A { }
複製代碼
/*eslint no-class-assign: "error"*/
/*eslint-env es6*/
class A {
b() {
A = 0;
}
}
複製代碼
/*eslint no-class-assign: "error"*/
/*eslint-env es6*/
let A = class A {
b() {
A = 0;
// `let A` is shadowed by the class name.
}
}
複製代碼
正確 代碼示例:
/*eslint no-class-assign: "error"*/
/*eslint-env es6*/
let A = class A { }
A = 0; // A is a variable.
複製代碼
/*eslint no-class-assign: "error"*/
/*eslint-env es6*/
let A = class {
b() {
A = 0; // A is a variable.
}
}
複製代碼
/*eslint no-class-assign: 2*/
/*eslint-env es6*/
class A {
b(A) {
A = 0; // A is a parameter.
}
}
複製代碼
禁止修改 const 聲明的變量
Rule Details
該規則旨在標記修改用const關鍵字聲明的變量。
錯誤 代碼示例:
/*eslint no-const-assign: "error"*/
/*eslint-env es6*/
const a = 0;
a = 1;
複製代碼
/*eslint no-const-assign: "error"*/
/*eslint-env es6*/
const a = 0;
a += 1;
複製代碼
/*eslint no-const-assign: "error"*/
/*eslint-env es6*/
const a = 0;
++a;
複製代碼
正確 代碼示例:
/*eslint no-const-assign: "error"*/
/*eslint-env es6*/
const a = 0;
console.log(a);
複製代碼
/*eslint no-const-assign: "error"*/
/*eslint-env es6*/
for (const a in [1, 2, 3]) { // `a` is re-defined (not modified) on each loop step.
console.log(a);
}
複製代碼
/*eslint no-const-assign: "error"*/
/*eslint-env es6*/
for (const a of [1, 2, 3]) { // `a` is re-defined (not modified) on each loop step.
console.log(a);
}
複製代碼
禁止類成員中出現重複的名稱
Rule Details
該規則旨在標記類成員中重複名稱的使用。
錯誤 代碼示例:
/*eslint no-dupe-class-members: "error"*/
/*eslint-env es6*/
class Foo {
bar() { }
bar() { }
}
class Foo {
bar() { }
get bar() { }
}
class Foo {
static bar() { }
static bar() { }
}
複製代碼
正確 代碼示例:
/*eslint no-dupe-class-members: "error"*/
/*eslint-env es6*/
class Foo {
bar() { }
qux() { }
}
class Foo {
get bar() { }
set bar(value) { }
}
class Foo {
static bar() { }
bar() { }
}
複製代碼
禁止 Symbolnew 操做符和 new 一塊兒使用
Rule Details
該規則旨在阻止使用 new 操做符調用 Symbol。
錯誤 代碼示例:
/*eslint no-new-symbol: "error"*/
/*eslint-env es6*/
var foo = new Symbol('foo');
複製代碼
正確 代碼示例:
/*eslint no-new-symbol: "error"*/
/*eslint-env es6*/
var foo = Symbol('foo');
// Ignores shadowed Symbol.
function bar(Symbol) {
const baz = new Symbol("baz");
}
複製代碼
禁止在構造函數中,在調用 super() 以前使用 this 或 super
Rule Details
該規則旨在標記出在調用 super() 以前使用 this 或 super 的狀況。
錯誤 代碼示例:
/*eslint no-this-before-super: "error"*/
/*eslint-env es6*/
class A extends B {
constructor() {
this.a = 0;
super();
}
}
class A extends B {
constructor() {
this.foo();
super();
}
}
class A extends B {
constructor() {
super.foo();
super();
}
}
class A extends B {
constructor() {
super(this.foo());
}
}
複製代碼
正確 代碼示例:
/*eslint no-this-before-super: "error"*/
/*eslint-env es6*/
class A {
constructor() {
this.a = 0; // OK, this class doesn't have an `extends` clause.
}
}
class A extends B {
constructor() {
super();
this.a = 0; // OK, this is after `super()`.
}
}
class A extends B {
foo() {
this.a = 0; // OK. this is not in a constructor.
}
}
複製代碼