對forEach、for-in還有es6的for-of的一些整理

用forEach遍歷數組的話, 不能用break跳出循環,也不能用return返回外層
若是要提早終止,必須把forEach()方法放在一個try塊中,並能拋出一個異常。若是forEach()調用的函數拋出foreach.break異常,循環會提早終止。
 
function foreach(a,f,t){
    try { a.forEach(f,t); }
    catch(e){
        if(e === foreach.breakreturn;
        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);
 
forvar word of uniqueWords){
     console.log(word);
}
 
//遍歷Map
//map是鍵值對組成的,因此須要解構來將鍵值對拆解爲兩個獨立變量:
forvar[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循環用來遍歷數據--如數組中的值。
相關文章
相關標籤/搜索