iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 13
0
自我挑戰組

學JS的心路歷程系列 第 13

學JS的心路歷程 Day13-for of 和 for in

  • 分享至 

  • xImage
  •  

我們在剛入門 JS 時候,說到要跑出陣列的每個值肯定都是這樣子:

var arr = [1,2,3,4,5,6];
for(let i = 0; i < arr.length; i++){
    console.log(arr[i])
}

在這之後,有出了 forEach 作為陣列原型使用 :

var arr = [1,2,3,4,5,6];
arr.forEach((item)=>console.log(item));

但是,物件要怎麼辦呢? 我們也可以用 forEach 嗎:

var obj = {a:1,b:2,c:3,d:4};
obj.forEach((item)=>console.log(item));
// TypeError: obj.forEach is not a function

看來是不行,幸好後來 JS 提供了 for-in

var obj = {a:1,b:2,c:3,d:4};
for(let item in obj){
	console.log(item);
    console.log(obj[item])
}

可以看到我們 跑出來的都是 key 值,那陣列也能跑嗎?

var arr = ["a","b","c","d","e","f"];
for(let item in arr){
	console.log(item);
    console.log(arr[item]);
}

恩....看起來好像是可以,但是這邊要注意到幾個 for-in 陷阱。

var arr = ["a","b","c","d","e","f"];
arr.sayHi = "HI!!!";
for(let item in arr){
	console.log(item);
    console.log(arr[item]);
}

可以看到說,我們自定義的屬性也會被顯示出來。
而且 for-in 的遍歷順序可能會有瀏覽器上的差異,導致無法以一致的順序遍歷元素,因此 MDN 建議不要用於陣列上:

那有沒有只能顯示陣列值的方法呢?

有的, ES6 推出了 for-of ,可以在「可迭代的物件」( Array,,Map,Set,String,TypedArray,arguments 等 )上作使用。

var arr = ["a","b","c","d","e","f"];
arr.sayHi = "HI!!!";
for(let item of arr){
	console.log(item);
}

var obj = {a:1,b:2,c:3,d:4};
for(let item of obj){
	console.log(item);
}//TypeError: obj is not iterable

所以一般來說沒有辦法在物件上作使用,若真的不得已要用的話可以這樣寫:

var obj = {a:1,b:2,c:3,d:4};
for(let item of Object.keys(obj)){
	console.log(obj[item]);
}

Object.keys(obj) 會把所有物件內的 key 值轉為陣列,這樣我們就能遍歷該物件了。

不過通常來說,for-in 會比較推薦用在物件上,而 for-of 會推薦用在陣列上。

參考資料:
javascript总for of和for in的区别?
MDN-for...in
MDN-for...of
使用Javascript中的換的循環


上一篇
學JS的心路歷程 Day12-正規表達式 Regular Expression
下一篇
學JS的心路歷程 Day14 - 陣列常見處理方法
系列文
學JS的心路歷程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言