js里的分号使用,解决yield表达式后跟解构赋值语句出现异常的问题

本文通过一个斐波那契数列的generator函数例子,探讨了JavaScript中分号的自动插入规则。在yield表达式后跟解构赋值导致错误的情况下,加入分号解决了问题。文章详细解释了JavaScript何时自动插入分号,并提供了避免因分号缺失导致代码错误的书写规范建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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. 书写规范

其实不加分号个人认为可以让代码看起来更优雅美观,只是我们最好注意这两点规则,避免因为分号破坏我们代码的本意:

  1. 注意return 语句。 如果你想返回一些东西,把它添加到与 return同一行上(同样用于break , throw , continue
  2. 永远不要用( 、 [ 、 / 、 + 或 -开始一行,这些可能与前一行连接以形成函数调用或数组元素引用
  3. 如果一定要用( 、 [ 、 / 、 + 或 -开头,那么可以在上一条语句末尾加上分号用以阻隔

参考链接
https://www.codercto.com/a/39941.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值