對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循環用來遍歷數據--如數組中的值。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM