# JavaScript Standard Style
这是 JavaScript standard 代码规范的全文.
掌握本规范的最好方法是安装并在自己的代码中使用它.
# 细则
使用两个空格进行缩进
eslint: indentfunction hello(name) { console.log('hi', name); }
1
2
3除需要转义的情况外, 字符串统一使用单引号
eslint: quotesconsole.log('hello there'); $("<div class='box'>");
1
2不要定义未使用的变量
eslint: no-unused-varsfunction myFunction() { var result = something(); }
1
2
3关键字后面加空格
eslint: keyword-spacingif (condition) { ... }
1函数声明时括号与函数名间加空格
eslint: space-before-function-parenfunction name (arg) { ... }
1始终使用
===
替代==
例外: obj == null 可以用来检查 null || undefined
eslint: eqeqeqif (name === 'John')
1字符串拼接操作符(Infix operators)之间要留空格
eslint: space-infix-opsvar x = 2; var message = 'hello, ' + name + '!';
1
2逗号后面加空格
eslint: comma-spacingvar list = [1, 2, 3, 4];
1else
关键字要与花括号保持在同一行
eslint: brace-styleif (condition) { // ... } else { // ... }
1
2
3
4
5多行
if
语句的括号不能省
eslint: curlyif (optons.quiet !== true) { console.log('done'); }
1
2
3不要丢掉异常处理中的
err
参数
eslint: handle-callback-errrun(function(err) { if (err) throw err; window.alert('done'); });
1
2
3
4使用浏览器全局变量时加上
window.
前缀
例外: document, console, navigator
eslint: no-defwindow.alert('hi');
1不允许有连续多行空行
eslint: no-multiple-empty-linesvar value = 'hello world'; console.log(value);
1
2对于三元运算符
?
和:
与他们所负责的代码处于同一行
eslint: operator-linebreakvar location = env.development ? 'localhost' : 'www..api.com';
1每个
var
关键字单独生命一个变量
eslint: one-varvar silent = true; var verbose = true;
1
2条件语句中赋值语句使用括号包起来
eslint: no-cond-assignwhile ((m = text.match(expr))) { // ... }
1
2
3单行代码库两边加空格
eslint: block-spacingfunction foo() { return true; }
1
2
3对于变量和函数名统一使用驼峰命名法
eslint: camelcasefunction myFunction() { var myVar = 'hello'; }
1
2
3不允许有多余的行末逗号
eslint: comma-danglevar obj = { message: 'hello', };
1
2
3始终将逗号置于行末
eslint: comma-stylevar obj = { foo: 'foo', bar: 'bar', };
1
2
3
4点号操作符与属性需在同一行
eslint: dot-locationconsole.log('hello');
1文件末尾留一空行
eslint: eol-last函数调用时标识符与括号间不留间隔
eslint: func-call-spacingconsole.log('hello');
1键值对当中冒号与值之间要留空白
eslint: key-spacingvar obj = { key: 'value' };
1构造函数要以大写字母开头
eslint: new-capfunction Animal() {} var dog = new Animal();
1
2无参的构造函数调用时要带上括号
eslint: new-parents对象中定义了存值器, 一定要对应的定义取值器
eslint: accessor-pairsvar person = { set name(value) { this._name = value; }, get name() { return this._name; }, };
1
2
3
4
5
6
7
8子类的构造器中一定要调用 super
eslint: constructor-superclass Dog extends Mammal { constructor() { super(); } }
1
2
3
4
5使用数组字面量而不是构造器
eslint: no-array-constructorvar nums = [1, 2, 3];
1避免使用
arguments.callee
和arguments.caller
eslint: no-caller避免对类名重新赋值
eslint: no-class-assignclass Dog {} Dog = 'Fido';
1
2避免修改使用
const
声明的变量
eslint: no-const-assignconst score = 100; score = 125;
1
2避免使用常量作为条件表达式的条件(循环语句除外)
eslint: no-constant-conditionwhile (true) { if (x === 0) { // ... } }
1
2
3
4
5正则中不要使用控制符
eslint: no-control-regex不要使用
debugger
eslint: no-debugger不要对变量使用
delete
操作
eslint: no-delete-var不要定义冗余的函数参数
eslint: no-dupe-args类中不要定义冗余的属性
eslint: no-dupe-class-members对象字面量中不要定义重复的属性
eslint: no-dupe-keysswitch
语句中不要定义重复的case
分支
eslint: no-duplicate-case同一模块有多个导入时一次性写完
eslint: no-duplicate-importsimport { myFunc1, myFunc2 } from 'module';
1正则中不要使用空字符
eslint: no-empty-character-class不要解构空值
eslint: no-empty-patternconst { a: { b }, } = foo;
1
2
3不要使用
eval()
eslint: no-evalcatch
中不要对错误重新赋值
eslint: no-ex-assign不要扩展原生对象
eslint: no-extend-native避免多余的函数上下文绑定
eslint: no-extra-bindconst name = function() { this.getName(); }.bind(user);
1
2
3避免不必要的布尔转换
eslint: no-extra-boolean-cast不要使用多余的括号包裹函数
eslint: no-extra-parensswitch
一定要使用break
来将条件分支正常中断
eslint: no-fallthroughswitch (filter) { case 1: doSomething(); break; case 2: doSomethingElse(); }
1
2
3
4
5
6
7不要省去小数点前面的
0
eslint: no-floating-decimalconst discount = 0.5;
1避免对声明过的函数重新赋值
eslint: no-func-assign不要对全局只读对象重新赋值
eslint: no-global-assign注意隐式的
eval()
eslint: no-implied-evalsetTimeout(function() { alert('hello world'); });
1
2
3嵌套的代码块中禁止再定义函数
eslint: no-inner-declarations不要向
RegExp
构造器传入非法的正则表达式
eslint: no-invalid-regexp不要使用非法的空白符
eslint: no-irregular-whitespace禁止使用
__iterator__
eslint: no-iterator外部变量不要与对象属性重名
eslint: no-label-var不要使用标签语句
eslint: no-labels不要书写不必要的嵌套代码块
eslint: no-lone-blocks不要混合使用空格与制表符作为缩进
eslint: no-mixed-spaces-and-tabs除了缩进, 不要使用多个空格
eslint: no-multi-spaces不要使用多行字符串
eslint: no-multi-strnew
创建对象实例后需要赋值给变量
eslint: no-new禁止使用
Function
构造器
eslint: no-new-func禁止使用
Object
构造器
eslint: no-new-object禁止使用
new require
eslint: no-new-require禁止使用
Symbol
构造器
eslint: no-new-symbol禁止使用原始包装器
eslint: no-new-wrappers不要将全局对象的属性作为函数调用
eslint: no-obj-calls不要使用八进制字面量
eslint: no-octal字符串字面量中也不要使用八进制转义字符
eslint: no-octal-escape使用
__dirname
和__filename
时尽量避免使用字符串拼接
eslint: no-path-concatconst pathToFile = path.join(__dirname, 'app.js');
1使用
getPrototypeOf
来替代__proto__
eslint: no-protoconst foo = Object.getPrototypeOf(obj);
1不要重复声明变量
eslint: no-redeclare正则中避免使用多个空格
eslint: no-regex-spacesreturn
语句中的赋值必需有括号包裹
eslint: no-return-assignfunction sum(a, b) { return (result = a + b); }
1
2
3避免将变量赋值给自己
eslint: no-self-assign避免将变量与自己进行比较操作
eslint: no-self-compare避免使用逗号操作符
eslint: no-sequences不要随意更改关键字的值
eslint: no-shadow-restructed-names禁止使用稀疏数组
eslint: no-sparse-arrays不要使用制表符
eslint: no-tabs正确使用 es6 中的字符串模板
eslint: no-template-curly-in-stringconst message = `Hello ${name}`;
1使用
this
前确保super()
已调用
eslint: no-this-before-superclass Dog extends Animal { constructor() { super(); this.legs = 4; } }
1
2
3
4
5
6用
throw
抛错时, 抛出Error
对象而不是字符串
eslint: no-throw-literalthrow new Error('error');
1行末不留空格
eslint: no-trailing-spaces不要使用
undefined
来初始化变量
eslint: no-undef-init循环语句中注意更新循环变量
eslint: no-unmodified-loop-condition如果有更好的实现, 尽量不要使用三元表达式
eslint: no-unneeded-ternaryreturn
,throw
,continue
和break
后不要再跟代码
eslint: no-unreachablefinally
代码块中不要再改变程序执行流程
eslint: no-unsafe-finally关系运算符的左值不要做取反操作
eslint: no-unsafe-negation避免不必要的
.call()
和.apply()
eslint: no-useless-call避免使用不必要的计算值作对象属性
eslint: no-useless-computed-key禁止多余的构造器
eslint: no-useless-constructor禁止不必要的转义
eslint: no-useless-escapeimport
,export
和解构操作中, 禁止赋值到同名变量
eslint: no-useless-rename属性前面不要加空格
eslint: no-whitespace-before-property禁止使用
with
eslint: no-with对象属性换行时注意统一代码风格
eslint: object-property-newline代码块中避免多余留白
eslint: padded-blocks展开运算符与它的表达式间不要留空白
eslint: rest-spread-spacing展开运算符与它的表达式间不要留空白
eslint: rest-spread-spacingfn(...args);
1遇到分号时空格要后留前不留
eslint: semi-spacingfor(let i = 0; i < items.length; i ++) { ...}
1代码块首尾留空格
eslint: space-before-blocksif (admin) { ... }
1圆括号间不留空格
eslint: space-in-parens一元运算符后面跟一个空格
eslint: space-unary-ops注释首尾留空格
eslint: spaced-comment// comment /* comment */
1
2模板字符串中变量前后不加空格
eslint: template-curly-spacing检查
NaN
的正确姿势是使用isNaN()
eslint: use-isnanif (isNaN(price)) { ... }
1用合法的字符串跟
typeof
进行比较操作
eslint: valid-typeof自调用匿名函数(IIFEs)使用括号包裹
eslint: wrap-iifeconst getName = (function() {})();
1yield *
中的*
前后都要有空格
eslint: yield-star-spacingyield * increment();
1请书写优雅的条件语句(avoid Yoda conditions)
eslint: yodaif (age === 15) { }
1
2
# 关于分号
不要使用分号
eslint: semiwindow.alert('hi');
1不要使用
(
,[
, ``` 等作为一行的开始