前言:對於前端到底要不要寫分號,各有各的說法,我反正是沒有這個習慣。然後,等被坑了之後,我有些話想說。
事情是這樣的,在群裡看到有人發了一段程式碼:
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是這樣,只要不加分號,他就認為你這個表示式還沒有結束,反正是挺坑的啊,希望自己能把新增分號作為一個習慣。
第一次發帖,各位大佬輕噴哈。