犀牛書第二章主要敘述了一下 JavaScript 的 詞法結構,其實就是 語法結構。babel
主要須要注意下 換行、分號的自動填補規則,知道了引擎的解析規則後就能夠避免由於省略了必要的分號而致使奇怪的 bug。工具
var a = 1, b = 2, c = 3
a = b + c
(b + c).toString()
複製代碼
function foo() {
return
123
}
console.log(foo());
複製代碼
JavaScript 中使用的是 Unicode 字符集,而且 區分大小寫。post
var abc = 1;
var ABC = 2;
// 1 2
console.log(abc, ABC);
複製代碼
換行符有時會被忽略,可能會致使沒必要要的 bug,具體見下方省略分號的意外bug。性能
分號自動填補的規則是:在缺乏分號會報錯(語法上)時自動在換行初填補分號。學習
var // 銜接下一行不報錯 ===> var a
a // 銜接下一行報錯,自動填補分號 ===> var a;
a // 銜接下一行不報錯 a =
= // 銜接下一行不報錯 a = 1
1 // 銜接下一行報錯,自動填補分號 ===> a = 1;
console.log // 銜接下一行不報錯 ===> console.log(a)
(a)
複製代碼
上述代碼等價於ui
var a; a = 1; console.log(a);
複製代碼
自動填補規則有 兩個例外狀況:spa
function foo() {
return // 遇到 return 直接補全分號
123
}
// undefined
console.log(foo());
複製代碼
上述代碼等價於code
function foo() {
return;
123
}
console.log(foo());
複製代碼
var a = 1, b = 2;
a // 下面是 ++ 運算符,放棄銜接,填補分號 ===> a;
++ // 銜接 ===> ++b
b // 銜接失敗,填補分號 ===> ++b;
// 1 3
console.log(a, b);
複製代碼
上述代碼等價於cdn
var a = 1, b = 2;
a;
++b;
console.log(a, b);
複製代碼
var a = 1, b = 2;
a
++ // 這裏會直接報錯
console.log(a, b);
複製代碼
某些狀況下省略分號會致使意料以外的 bug。blog
var a = 1, b = 2, c = 3;
a = b + c // 這裏會將嘗試銜接下一句 ===> a = b + c(b+c).toString(),語法解析上沒有問題,可是卻不是編寫者的本意,從而致使了意料以外的結果
(b + c).toString()
複製代碼
是否須要在全部地方都填補分號是個風格問題 沒有孰優孰劣,這個問題通常 靠團隊代碼風格的統一,或者 一些代碼的格式化工具 就能夠 很好的解決(好比 prettier)。
不過實質上而言加上分號比不加分號在編譯性能上會有所優點,由於不加分號會讓 JavaScript 一直猜想何時須要填補分號,可是在如今都用 babel 等預編譯代碼的狀況下並沒什麼區別。