1. 错误代码
先上错误代码
这里我试图用generator函数加上for…of实现斐波那契数列的求值,但是打印出来的结果不是预期的1 1 2 3 5 8,而是
[1,1],[1,1],[1,1]…
function* fib(n) {
let [prev, curr] = [0, 1]
for (let i = 0; i <= n; i++) {
yield curr
[prev, curr] = [curr, prev + curr]
}
}
for (let n of fib(5)) {
console.log(n)
}
刚开始的时候我怀疑难道是解构赋值出错??因为采用如下的代码时可以通过的
function* fib(n) {
let [prev, curr] = [0, 1]
for (let i=0;i<=n ;i++) {
yield curr
tmp = prev
prev = curr
curr = tmp + curr
}
}
for (let item of fib(5)) {
console.log(item);
}
但是转头一想,解构赋值和利用tmp中间值交换值的原理不是差不多的吗?而且打印输出[1,1]让我真的很困惑,为什么yield
后面跟着的表达式curr会被解析成一个[1,1]的数组??
往下一看,[prev, curr]不就是一个二元数组吗??难道是因为我没有加分号,js引擎把这句代码解析成 yield curr[prev, curr] = [curr, prev + curr]
?于是我加上了一个分号,测试通过!
function* fib(n) {
let [prev, curr] = [0, 1]
for (let i = 0; i <= n; i++) {
yield curr
[prev, curr] = [curr, prev + curr]
}
}
for (let n of fib(5)) {
console.log(n)
}
于是我去复习了一下js里面分号的使用规则
2.js分号的使用规则
1. JavaScript 自动插入分号 的规则
JavaScript 并不是在所有换行处都填补分号:只有在缺少了分号就无法正确解析代码的时候,JavaScript才会填补分号。在解析源代码期间,要是发现以下特定的情况时,JavaScript 解析器 将会自动添加分号 :
- 当下一行代码开始会破坏当前一行的代码时( JavaScript 代码可以写在多行中 )。如果一条语句以 ( 、 [ 、 / 、 + 或 - 开始,那么它极有可能和前面一条语句合在一起解析。
- 当下一行以 } 开头时,闭合当前代码块,当然对象字面量除外
- 当解析到达源代码文件的末尾时
- 当前行 return 语句后面紧跟着换行时
- 当前行 break 语句后面紧跟着换行时
- 当前行 throw 语句后面紧跟着换行时
- 当前行 continue 语句后面紧跟着换行时
eg: s=a+b(x+y).doSomething
case true:
s=a+b
(x+y).doSomething()
eg:并不会return 对象,而是return undefined,
(() => {
return
{
color: 'white'
}
})()
2. 书写规范
其实不加分号个人认为可以让代码看起来更优雅美观,只是我们最好注意这两点规则,避免因为分号破坏我们代码的本意:
- 注意
return
语句。 如果你想返回一些东西,把它添加到与return
同一行上(同样用于break , throw , continue
) - 永远不要用
( 、 [ 、 / 、 + 或 -
开始一行,这些可能与前一行连接以形成函数调用或数组元素引用 - 如果一定要用
( 、 [ 、 / 、 + 或 -
开头,那么可以在上一条语句末尾加上分号用以阻隔
参考链接
https://www.codercto.com/a/39941.html