首先看一段代码
1 function* fib (max) { 2 let a = 0 3 let b = 1 4 let n = 1 5 while (n < max) { 6 yield a; 7 [a, b] = [b, a + b] 8 } 9 } 10 11 let [first, second, third, fourth, fifth] = fib(5)
实现裴波那切数列,输出结果,正常
[first, second, third, fourth, fifth] // 0, 1, 1, 2, 3
注意看第6行,加入将第6行后的分号去掉,输入结果如下
[1,1, 1,1, 1,1, 1,1, 1,1]
每一项都是 [1, 1],因为第6行在省去分号之后,被解析为
yield a[a, b] = [b, a + b]
那么问题来了,对于分号的解析规则是怎样的呢?
- 规则一:仅在“}”后、一行结束时以及一段程序结束处自动添加分号
- 规则二:仅在下一行第一个字符无法解析时自动添加分号,注意:若第二行以(、[、+、-或/开头时,JavaScript不会自动添加分号
-
1 a = b 2 (fn()) 3 4 // 会被解析为 5 a = b(fn())
-
- 规则三:for循环及空循环体的while不能省略分号
-
1 // for 正常写法 2 for (var i = 0; i < 10; i++) { 3 console.log(i) 4 } 5 6 // for 中分号不能省略,会报错 7 for (var i = 0 8 i < 10 9 i++ 10 ) { 11 console.log(i) 12 }
-
1 // while 出现空循环体时, 正常写法 2 3 while(flag); 4 5 // 省略分号,解析报错 6 while(flag)
-
根据以上规则描述,开始的示例中,应该归属于规则二,所以分号省略与否对结果还是有比较大的影响
但是,在使用过程中分号的省略与否和个人编码风格关系更大一些,知道原理更加重要,在关键位置注意分号的使用即可。