JS Const 關鍵字用於 Foreach
對於 const
相信大家已經用的熟的不能再熟了,這裏想談論一下關於我的疑問對於 const
按照慣例還是放個小的代碼片
for(const i = 0;i < n;i++) {
console.info(i) // error
}
上面的代碼不能正常運行,這是正常的,在我們的預料範圍之內
const
對於在 stack
上存儲的數據向來都是比較 “嚴格” 的,但是有的情況卻不然,比如下面這段代碼可能會打破你的認知
const arr = [1, 2, 3]
for(const val of arr) {
console.info(val) // 1, 2, 3
}
上面的代碼依然能正常跑起來
長久以來,用 foreach
的時候都沒有注意到這個問題,今天還是寫一篇博文來記錄一下這個神奇的瞬間
進入正題,上面的代碼之所以能跑起來,是因爲 foreach
中的 const val of arr
是會在每次迭代的時候在新作用域裏都執行一次,所以這裏並沒有違背 const
,不僅僅是 for ... of
,凡是 foreach
都是能正常工作的,比如上面的代碼換成 for...in
也是能正常工作。
但是爲什麼第一個代碼片卻不能正常執行呢?答案是因爲 for
的初始化只會在開始迭代之前執行一次,以後的每次迭代都不會再去執行初始化聲明,所以自然是不能正常工作的。
爲什麼當初這樣設計? 個人拙見。是因爲 foreach
不會有給迭代變量賦值的場景,所以你照下面這樣執行,也是沒有副作用的
for(let v of arr){
console.info(v)
v = 1
}
還有一個原因可能是因爲簡化 iterator
的實現,每次迭代不用再去關心迭代變量帶來的副作用
小記。