for和for in
for … in循環(huán)由于歷史遺留問題冀偶,它遍歷的實際上是對象的屬性名稱臼朗。一個Array數(shù)組實際上也是一個對象豹缀,它的每個元素的索引被視為一個屬性藤巢。
當(dāng)我們手動給Array對象添加了額外的屬性后竟纳,for … in循環(huán)將帶來意想不到的意外效果:
var a = ['A','B','C'];
a.name ='Hello';
for(var i in a) { console.log(i);//0','1','2','name'}
而for循環(huán)去識別不了
for (var i = 0; i < a.length; i++) {
console.log(i)// 0,1,2
console.log(a.length) //3
}
for … in循環(huán)將把name包括在內(nèi)撵溃,但Array的length屬性卻不包括在內(nèi)。
for of循環(huán)
for … of循環(huán)則完全修復(fù)了這些問題锥累,它只循環(huán)集合本身的元素:
var a = ['A','B','C'];
a.name ='Hello';
for(var i of a ) { alert(i);//'A','B','C'
}
這就是為什么要引入新的for … of循環(huán)缘挑。
然而,更好的方式是直接使用iterable內(nèi)置的forEach方法桶略,它接收一個函數(shù)语淘,每次迭代就自動回調(diào)該函數(shù)。以Array為例:
var a = ['A','B','C'];
a.forEach(function(element, index, array){// element: 指向當(dāng)前元素的值
// index: 指向當(dāng)前索引// array: 指向Array對象本身alert(element)
});
注意际歼,forEach()方法是ES5.1標(biāo)準(zhǔn)引入的惶翻,你需要測試瀏覽器是否支持。
總結(jié)
for循環(huán)可一遍歷數(shù)組鹅心,而for in循環(huán)可以遍歷數(shù)組和對象
使用for in循環(huán)會將Array當(dāng)成對象遍歷维贺,而Array的存取速度明顯比Object要快。所以使用for循環(huán)遍歷數(shù)組比for in循環(huán)遍歷快巴帮。
for循環(huán)遍歷的是索引數(shù)組溯泣,通過索引來調(diào)用虐秋,i的返回值是number類型
而for in循環(huán)遍歷的是關(guān)聯(lián)數(shù)組,通過key來調(diào)用垃沦,i的返回值是string類型
這兩者的具體用途 得看你用他的環(huán)境是什么.不能一概而論.
索引數(shù)組:僅僅用于存儲數(shù)據(jù). 優(yōu)勢在于迭代方便
關(guān)聯(lián)數(shù)組:用于存放對應(yīng)的數(shù)據(jù)格式, 優(yōu)勢在于 可以很方便 特定key對應(yīng)的value 缺點:迭代麻煩