JS Const 關鍵字用於 Foreach

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 的實現,每次迭代不用再去關心迭代變量帶來的副作用

小記。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章