1、命名
(1)命名应遵循简洁、语义化的原则,定义的时候赋值能更好的了解变量语义。
//bad
let id,inp,obj,shifou;
//good
let userId = 0,
input = '',
userInfo = null,
isAdult = false;
(2)变量名含多个单词或者太长,可使用小驼峰式命名法并缩写
//bad
let maximumNumber;
//good
let maxNum = 0;
(3)全局常量使用大写字母和下划线来组合命名,下划线用以分割单词。
const MAX_COUNT = 10;
const URL = 'https://blog.csdn.net/m0_37820751';
2、缩进
行首的空格和 Tab 键,都可以产生代码缩进效果,无论选择哪一种方法都可以,只需统一使用一种。每次写完一段代码,养成格式化代码的习惯。
3、行尾的分号
分号表示一条语句的结束。虽然JavaScript 允许省略行尾的分号。由于解释引擎自动添加分号的行为难以预测,因此编写代码的时候不应该省略行尾的分号。
可以不使用分号的情况
(1)for 和 while 循环
for ( ; ; ) {
} // 没有分号
while (true) {
} // 没有分号
(2)分支语句:if,switch,try
if (true) {
} // 没有分号
switch () {
} // 没有分号
try {
} catch {
} // 没有分号
(3)函数的声明语句
function f() {
} // 没有分号
除了上面的三种情况,所有语句都应该使用分号,如果使用了分号,也不会出错,因为,解释引擎会把这个分号解释为空语句
虽然不使用分号,大多数情况下,JavaScript 会自动添加。
var a = 1
// 等同于
var a = 1;
但如果下一行的开始可以与本行的结尾连在一起解释,JavaScript 就不会自动添加分号。
// 等同于 var a = 3
var
a
=
3
// 等同于 'abc'.length
'abc'
.length
如果习惯了省略分号,可能会出现不容易看出来的BUG,所以建议不要省略这个分号。
// 引擎解释为 c(d+e)
var a = b + c
(d+e).toString();
// 解释为'b'['red', 'green'],
// 即把字符串当作一个数组,按索引取值
var a = 'b'
['red', 'green'].forEach(function (c) {
console.log(c);
})
其他原因:有些 JavaScript 代码压缩器(uglifier)不会自动添加分号,因此遇到没有分号的结尾,就会让代码保持原状,而不是压缩成一行,使得压缩无法得到最优的结果。
另外,不写结尾的分号,可能会导致脚本合并出错。所以,有的代码库在第一行语句开始前,会加上一个分号。
;var a = 1;
// 避免与其他脚本合并时,排在前面的脚本最后一行语句没有分号,导致运行出错的问题。
4、严格相等运算符取代相等运算符
相等运算符会自动转换变量类型,造成很多意想不到的情况。
0 == ''// true
1 == true // true
2 == true // false
0 == '0' // true
false == 'false' // false
false == '0' // true
' \t\r\n ' == 0 // true
如果需要判断某值为null,就不能使用===,那我们也可以使用逻辑运算符来取代==。
if(!judge){
console.log('null');
}
//等同于
if(judge == null){
console.log('null');
}
5、简短的if语句可以改用三元运算符,减少代码行数
if(a === b){
console.log(1);
} else {
console.log(2);
}
//等同于
a === b ? console.log(1) : console.log(2);
6、let/const 取代 var
var 会重复声明变量;let有块级作用域,且没有任何副作用;
var x = 'hello'
if (true) {
var x = 'world';
}
console.log(x); // world
var i = 100;
for (var i = 0; i < 10; i++) {
console.log(i);
}
console.log(i); // 10
var x = 'hello';
if (true) {
let x = 'world';
}
console.log(x) // hello
let i = 100;
for (let i = 0; i < 10; i++) {
console.log(i);
}
console.log(i) // 100
7、字符串使用单引号或反引号
静态字符串一律使用单引号或反引号,不使用双引号。动态字符串(字符串模板)使用反引号。用单引号的好处:
1.输入单引号不需要按住shitf,方便输入
2.在实际使用中,字符串很多时候会用来拼接html,html内有双引号,字符串用单引号的话就可以省去了转义html的双引号。也可以统一自己的格式。
// good
const a = 'foobar';
const b = `foo${a}bar`;
const html = '<div class="red"></div>'
8、声明定义较多时,使用结构赋值
let a = 1, b = 2, c = 3, d = 4;
//等同于
let [a, b, c, d] = [1, 2, 3, 4];
9、拷贝数组
使用扩展运算符(...)拷贝数组。
let listCopy = [];
// bad
for (let i = 0; i < list.length; i++) {
listCopy[i] = list[i];
}
// good
let listCopy = [...list];
10、箭头函数的使用。
那些使用匿名函数当作参数的场合,尽量用箭头函数代替。因为这样更简洁,而且绑定了 this。
let dataList = {
value: 2,
}
let that = this;
$.ajax({
type:'GET',
url:'http://www.young1024.com:666/lyric?id=33894312',
success: function (data) {
console.log(data);
console.log(this); //ajax对象
console.log(this.dataList);
}
})
//ajax --箭头函数
$.ajax({
type:'GET',
url:'http://www.young1024.com:666/lyric?id=33894312',
success: (data)=>{
console.log(data);
console.log(this); //window对象
console.log(this.dataList);
}
})