學起來學起來。
懶人包
for...in
會輸出key
,通常用在 object(ES5)for...of
會輸出value
只能用在 array(ES6)
兩者的差異
1 | const arr = [1, 2, 3, 4, 5, 6] |
for…in 的幾個特點
- 會輸出在陣列中新增的 key
1 | const arr = [1, 2, 3, 4, 5] |
for...of
會按照 arr[0]
, arr[1]...
這樣的順序去迭代,所以不會迭代到 arr['myKey']
這個值,也就沒辦法輸出 'hello'
了。
- 會輸出從原型鏈中繼承的屬性
1 | const arr = [1, 2, 3, 4, 5] |
這裡談的 prototype
是指我們自己額外新增的才算數,不包含原本內建的。
1 | const arr = [1, 2, 3, 4, 5] |
既然是原型鏈,那只要能夠在原型鏈中的 prototype
找到的屬性都能算數。不過範圍跟剛才一樣,僅限於我們另外新增的才算數。
for…of 並不能迭代物件的值
前面有提到 for...of
是按照 arr[0]
, arr[1]...
這樣的順序來迭代出 value
。所以當 for..of
的對象是物件(Object)的話,會拋出一個錯誤跟你說:「這是一個沒辦法迭代的對象」
1 | const me = { |
雖然 for..of
本身無法做到,但可以搭配 Object.keys()
來取出物件中的值。
1 | const me = { |
這裡的小巧思就是,for...of
的對象仍然是陣列(Array),但這個陣列包含了所有我們需要的 key
值,利用它就能取出物件中的每個值。