for in 和 for of 的區別

2022-07-26 07:30:20 字數 2213 閱讀 6367

1、for...in 迴圈:只能獲得物件的鍵名,不能獲得鍵值

for...of 迴圈:允許遍歷獲得鍵值

var arr = ['red', 'green', 'blue']

for(let item in arr)

/*for in item 0

for in item 1

for in item 2

*/for(let item of arr)

/*for of item red

for of item green

for of item blue

*/

2、對於普通物件,沒有部署原生的 iterator 介面,直接使用 for...of 會報錯

var obj = 

for(let key of obj)

// uncaught typeerror: obj is not iterable

可以使用 for...in 迴圈遍歷鍵名

for(let key in obj) 

/*for in key name

for in key age

*/

也可以使用 object.keys(obj) 方法將物件的鍵名生成乙個陣列,然後遍歷這個陣列

for(let key of object.keys(obj)) 

/*key name

key age

*/

3、for...in 迴圈不僅遍歷數字鍵名,還會遍歷手動新增的其它鍵,甚至包括原型鏈上的鍵。for...of 則不會這樣

let arr = [1, 2, 3]

arr.set = 'world' // 手動新增的鍵

array.prototype.name = 'hello' // 原型鏈上的鍵

for(let item in arr)

/*item 0

item 1

item 2

item set

item name

*/for(let value of arr)

/*value 1

value 2

value 3

*/

4、foreach 迴圈無法中途跳出,break 命令或 return 命令都不能奏效

let arr = [1, 2, 3, 5, 9]

arr.foreach(item =>

console.log('item', item)

})/*

item 1

item 3

item 5

item 9

*/

for...of 迴圈可以與break、continue 和 return 配合使用,跳出迴圈

for(let item of arr) 

console.log('item', item)

} // item 1

5、無論是 for...in 還是 for...of 都不能遍歷出 symbol 型別的值,遍歷 symbol 型別的值需要用 object.getownpropertysymbols() 方法

for(let key in

obj)

/*c --> es6

d --> dom

*/let objsymbols =object.getownpropertysymbols(obj)

console.info(objsymbols)

//[symbol(a), symbol(b)]

objsymbols.foreach(item =>)

/*symbol(a) --> hello

symbol(b) --> world

*/ 方法可以返回所有型別的鍵名,包括常規鍵名和symbol鍵名

let keyarray =reflect.ownkeys(obj)

console.log(keyarray)

//["c", "d", symbol(a), symbol(b)]

}

總之,for...in 迴圈主要是為了遍歷物件而生,不適用於遍歷陣列

for...of 迴圈可以用來遍歷陣列、類陣列物件,字串、set、map 以及 generator 物件

for of 和 for in 的區別

var obj for var key of obj 出錯 uncaught typeerror obj is not iterablevar obj for var key in obj 結果是 a b cvar arr 3 5,7 for var i in arr 結果是 0 1 2var ar...

for in 和for of的區別

es5的話也可以使用foreach,es5具有遍歷陣列功能的還有map filter some every reduce reduceright等,只不過他們的返回結果不一樣。但是使用foreach遍歷陣列的話,使用break不能中斷迴圈,使用return也不能返回到外層函式。array.proto...

for in 和for of 的區別

最近在學習es6的知識,看到了for of 這新的迴圈方法,所以就測試一下和以前for in有什麼不同,一下是一些不同地方,當然還有其他不同的,暫時還沒有發現 for in迴圈由於歷史遺留問題,它遍歷的實際上是物件的屬性名稱。乙個array陣列實際上也是乙個物件,它的每個元素的索引被視為乙個屬性。當...