本文原鏈接:https://cloud.tencent.com/developer/article/1360074
for of 和 for in 循環
循環遍歷數組的時候,你還在用 for
語句走天下嗎?
我曾經就是 for
走天下,最后發現自己給自己挖了一個巨大的坑,層層嵌套的循環,總要花大量的時間去捋清各種邏輯關系,很容易邏輯混亂。終於你經過千辛萬苦把邏輯捋清了,實現了功能需求。可是這時候接踵而來的問題來了?性能,擴展性,重用性....等等,合着我費了九牛二虎之力白費了。這時候一把鼻涕一把淚,滿是辛酸;
后來就很少很少使用 for
取而代之的是 API
和 ES6
的一些新特性
數組的 for of
一說到循環我們很容易想到 for in
,但是我們應該要知道的是 他更適合用來遍歷對象而不是數組,有人說他是為遍歷普通對象而設計的。
理由:
for in
遍歷是隨機的,數組遍歷是按照一定順序的。
for in
遍歷數組索引的時候可能得到的是字符串索引而不是數字索引,而我們希望數組遍歷是數字索引遍歷(除了關聯數組之外)
for ... in
循環由於歷史遺留問題,它遍歷的實際上是對象的屬性名稱。一個Array
數組實際上也是一個對象,它的每個元素的索引被視為一個屬性。

循環我們也很容易想到 forEach()
方法
- Array.prototype.forEach() : 方法對數組的每個元素執行一次提供的函數。
array.forEach(callback(currentValue, index, array){ //do something }, this) 復制代碼
參數
callback
: 為數組中每個元素執行的函數,該函數接收三個參數:
currentValue
(當前值): 數組中正在處理的當前元素。
index(索引)
: 數組中正在處理的當前元素的索引。
array
: forEach()
方法正在操作的數組。
thisArg
可選:可選參數。當執行回調 函數時用作cthis
的值(參考對象)。
返回值:undefined
局限: 不能使用 break
中斷循環,也不能使用 return
語句返回到外層函數

此刻我想像你推薦 for...of 循環,你的不二之選
for of
遍歷數組應該是最好的選擇,最簡潔、最直接的遍歷數組元素的語法,可以使用break
、continue
和 return
語句,同時他避開了 for in
循環的缺陷

for-of
循環不僅支持數組,還支持大多數類數組對象,for-of
循環也支持字符串遍歷。
我們可以把字符串假象成數組的一種,字符串有的方法數組都有,它同樣支持 Map
和 Set
對象遍歷。簡而言之就是有迭代器方法的都可以用for of
循環(如果你還不知道Map
和Set
我們可以開始他們的學習路程了)
再來說一說數組其他遍歷的API
- Array.prototype.filter(): 方法創建一個新數組, 其包含通過所提供函數實現的測試的所有元素。
const new_array = arr.filter(callback[, thisArg]) 復制代碼
callback
:用來測試數組的每個元素的函數。調用時使用參數 (element
, index
, array
)。返回 true
表示保留該元素(通過測試),false
則不保留。
thisArg
:可選。執行 callback
時的用於 this
的值。
返回值:一個新的通過測試的元素的集合的數組
- Array.prototype.map(): 創建一個新數組,其結果是該數組中的每個元素都調用一個提供的函數后返回的結果。
let new_array = arr.map(function callback(currentValue, index, array) { // Return element for new_array }[, thisArg]) 復制代碼
callback
: 生成新數組元素的函數,使用三個參數:
currentValue
: callback
的第一個參數,數組中正在處理的當前元素。
index
:callback
的第二個參數,數組中正在處理的當前元素的索引。
array
: callback
的第三個參數,map
方法被調用的數組。
ound: #eee;">thisArg
:可選的。執行 callback
函數時 使用的this
值。
- Array.prototype.every(): 如果數組中的每個元素都滿足測試函數,則返回
true
,否則返回false
。 - Array.prototype.some(): 如果數組中至少有一個元素滿足測試函數,則返回
true
,否則返回false
。