js的分号把我坑了,该长记性了

408 阅读1分钟

前言:对于前端到底要不要写分号,各有各的说法,我反正是没有这个习惯。然后,等被坑了之后,我有些话想说。

事情是这样的,在群里看到有人发了一段代码:

function * fibs(){
    let a = 0;
    let b = 1;
    while(true){
        yield a;
        [a, b] = [b, a + b];
    }
}
[first, second, third, fourth, fifth, sixth] = fibs()
sixth // 5

他的问题是这段代码怎么解读,不会死吗?当然,我看到这段代码是好奇最后的数组解构赋值的结果。如果这段代码正常工作,那么就验证了我的猜想。试着动动手的心态去试了下:

function * fibs(){
    let a = 0, b = 1;
    while(true){
        yield a;
        [a, b] = [b, a + b]
    }
}
[first, second, third, fourth, fifth, sixth] = fibs()
sixth//[1, 1]

咦,这什么鬼,为什么不一样?

然后,苦苦寻觅,越是尝试越是崩溃,不行,我得按照原图中的写一遍:

function * fibs(){
    let a = 0;
    let b = 1;
    while(true){
        yield a;
        [a, b] = [b, a + b];
    }
}
[first, second, third, fourth, fifth, sixth] = fibs()
sixth // 5

我想你也知道了,就是因为这个分号导致的结果不同。

解决了这个问题之后,我再考虑之前的问题,es6的数组解构赋值是不是直接调用next方法了?查了下资料,发现的确是这样啊,查阅 exporting es6 -- Destructuring, 第一行就是。

额,这个有点坑,我不确定是不是只有yield是这样,只要不加分号,他就认为你这个表达式还没有结束,反正是挺坑的啊,希望自己能把添加分号作为一个习惯。

第一次发帖,各位大佬轻喷哈。