js到底需不需要寫分號(;), 我被坑了,該長記性了

我怎麼辣麼菜雞啊發表於2019-01-03

前言:對於前端到底要不要寫分號,各有各的說法,我反正是沒有這個習慣。然後,等被坑了之後,我有些話想說。

事情是這樣的,在群裡看到有人發了一段程式碼:

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是這樣,只要不加分號,他就認為你這個表示式還沒有結束,反正是挺坑的啊,希望自己能把新增分號作為一個習慣。

第一次發帖,各位大佬輕噴哈。

相關文章