用forEach遍歷數組的話,
不能用break跳出循環,也不能用return返回外層。
如果要提前終止,必須把forEach()方法放在一個try塊中,並能拋出一個異常。如果forEach()調用的函數拋出foreach.break異常,循環會提前終止。
function foreach(a,f,t){ try { a.forEach(f,t); } catch(e){ if(e === foreach.break)return; else throw e; } } foreach.break = new Error("StopIteration");
for...in
循環只遍歷可枚舉屬性。像 Array 和 Object , Number等 js中基本包裝類型的原型屬性是不可枚舉的 , 它們是使用內置構造函數所創建的對象都會繼承自 Object.prototype 和 String.prototype 的不可枚舉屬性,例如
String
的
indexOf()
方法或者
Object 的
toString
方法。
循環將迭代對象的所有可枚舉屬性和從它的構造函數的 prototype 繼承而來的(包括被覆蓋的內建屬性)。
可以注意到for-in循環
能夠枚舉繼承的屬性名,所以在
數組上不建議使用for-in循環。
可以使用 hasOwnProperty方法來過濾。所有繼承了
Object
的對象都會繼承到
hasOwnProperty
方法。這個方法可以用來檢測一個對象是否含有特定的自身屬性;和
in
運算符不同,該方法會忽略掉那些從原型鏈上繼承到的屬性。
for(var i in a){
if(!a.hasOwnProperty(i)) continue;//跳過繼承的屬性
//循環體
}
不建議用for-in循環遍歷數組還有以下幾點原因:
- 代碼中的index不是數字,是字符串“0”、“1”、“2”,可能無意間進行字符串的計算“2”+1=“21”等。
- 代碼可能按照隨機順序遍歷數組元素。
for-in是為了對象設計的,可以遍歷字符串型的鍵。
ps:屬性的枚舉性還會影響以下兩個函數的結果: Object.keys() ; JSON.stringify(); 它們只能返回對象本身具有的可枚舉屬性。
for-of循環
for(var value of myArray){ console.log(value); }
它和forEach不同,它可以break、continue、return。同時又避開了for-in 的缺點。
for-of可以遍歷:
- 數組
- 大多數類數組對象:如DOM的NodeList對象
- 字符串
- 也支持map和set對象的遍歷
例如
//遍歷Set //基於單詞數組創建一個set對象 var uniqueWords= new Set(words); for(var word of uniqueWords){ console.log(word); } //遍歷Map //map是鍵值對組成的,所以需要解構來將鍵值對拆解為兩個獨立變量: for(var[key,value] of phoneBookMap){ console.log(key+"'s phone number is:" + value); } for-of不支持普通對象,如果你想迭代一個對象屬性,可以用for-in循環或內建Object.keys()方法: for(var key of object.keys(someObject)){ console.log(key+":"+someObject[key]); }
for-in循環用來遍歷對象屬性,for-of循環用來遍歷數據--如數組中的值。