學起來學起來。
懶人包
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 值,利用它就能取出物件中的每個值。