for 迴圈常見問題及用法
為何下方全域結果是 3
1 | for(var i=0; i<3; i++) { |
流程如下
1 | 3>0 成立,跑完 {} 內容後,i++ 後,i 變成1 |
所以 當 i=2 成立跑完後, 進行 i++,會變成 3,這樣 3 才能在下個迴圈判斷是否有成立條件哩
因為當 i 跑到 3 時候,3 不小於 3 所以跳出迴圈
但在迴圈中用 var 宣告 i 會把 i 添加到 window 底下變成全域變數,
所以 i 最後的值是 3
for 迴圈 length 的宣告與不宣告變數
1 | var data = [5, 8, 15]; |
宣告變數給 length,需注意如果迴圈並非取的是陣列內容,而是自定義數字
在迴圈執行階段記憶體還沒釋放,所以還是舊內容
所以在此是建議直接用 length 隨時抓取長度,缺點是效能就會明顯不好
1 | var data = [5, 8, 15]; |
若直接使用 data.length 每跑一次 for 迴圈他就還必須偵測陣列長度一次
因為重複計算長度而導致資料量大時,效能就會明顯不好
而使用變數儲存 data.length 因直接取得數量,所以相較之下效能會比較好
for 迴圈的 length 全域和區域宣告
如果在 for 迴圈內宣告區域變數的話,他每次只要跑一次 for 迴圈裡面的區域變數都會被歸零,也就導致不會累加,所以抓到的內容就只會是最後一筆資料,也就是 140
因此要在外層全域宣告變數才能夠累加結果
1 | var farms = [ |
關於 +=
1 | totalchick += farms[i].chick; |
若有內容要加上去,又不影響原本的字串,那就可以用
1 | totalchick = totalchick + 'abc' |
而 totalchick+='abc',就是一種縮寫方式,此種方式等同於
1 | totalchick = totalchick+ 'abc' |
for 迴圈 - i++ 寫法
下面都是同樣內容,不同的表達方式
1 | i = i + 1; |
i++,他先回傳數值,所以回傳 1,接著再度呼叫時候再加上 1
另外也有一種 ++i++i,他本身加 1,所以回傳 2 ,接著再度呼叫時候再回傳加總後的數值
兩種差別可參考這個範例
for 迴圈與 break 運用
break 和 if 以及 for 迴圈,這是要看使用狀況而定,在此做個小範例
如果單使用 if,在此範例只能判斷是否有撈到陣列資料如 JS 第 23 行所顯示一樣
會使用迴圈是因為要從陣列去撈資料出來顯示
JS 第 28 行,如果只是想撈一筆農夫資料就在迴圈中直接加上 break,讓他只跑一次迴圈
JS 第 37 行,想知道哪些農場的小雞有 100 隻以上,就在迴圈中加入 if 判斷讓他跑出相應的資料
JS 第 48 行,只列出 1 筆有符合有養 100 隻小雞以上的農場
這些都是依照使用情境狀況而去設計的程式
下面這篇文章在敘述使用 break 的狀況,裡面有說為何需要 break
https://blog.csdn.net/XXJ19950917/article/details/78310346
「如果一個循環的終止條件非常複雜,那麼使用 break 語句來實現某些條件比用一個循環表達式所有的條件容易得多。」
splice 刪除和更新 for 迴圈資料的情況
這個 Codepen 裡面的範例有出現無法刪除的錯誤狀況
因為 len 和 str 需要放在 updateList () 內
1 | var len=listarea.length; |
也就是刪除資料時, listarea 的資料會變更
但 var len=listarea.length; 放在全域環境下
所取得的資料長度是一開始的 3 筆資料
因此導致刪除出錯
而 var str=''; 放在全域則會累加全域的 listarea 資料
所以建議這兩行都要放在 updateList () 內