背景:由於對 for in 不熟悉,只在數組循環的時候使用過,在一次用 for in 遍歷 json 數組的時候,調試看到是按照數組中字符逐個遍歷,由於當時急,以爲 for in 有什麼不安全的地方,根本沒來得及看,果斷用 for 循環。後來想想,應該是當時沒有將返回的結果反序列化,拙~~~。(後來寫for 的時候應該是加了反序列化)。
1. for in 可循環遍歷數組、對象(非數組對象上遍歷也稱枚舉)、字符串:
var str = "test";
var obj = {a : 'a', b : 'b'};var arr = [1, 2, 3, 4];
// 字符串:按序逐個輸出字符
for(var ele in str) {alert(str[ele]);
}
// 對象
for(var ele in obj){
alert(obj[ele]);
}
// 數組
for(var ele in arr){
alert(arr[ele]);
}
2. for in 不會按照屬性下標輸出
var data = {
'4': 'first',
'3': 'second',
'2': 'third',
'1': 'fourth'
};
for (var i in data) {
console.log(i + " " + data[i])
}
輸出結果:
1 fourth
2 third
3 second
4 first
注:按照網上描述,如今所有瀏覽器的最新版本現在都按chrome的標準執行,先把當中的非負整數鍵提出來,排序好輸出,然後將剩下的定義時的順序輸出。所以,在定義對象的時候,最好不要以純數字定義鍵名。
3. for in 循環訪問的是循環對象的原型
var array=[1,2,3,4,5];
Array.prototype.age=6;
var result = [];
for(var i=0;i<array.length;i++){
result.push(array[i]);
}
alert(result.join(''));
輸出結果:12345;
var array=[1,2,3,4,5];
Array.prototype.age=6;
var result = [];
for(var i in array){
result.push(array[i]);
}
alert(result.join(''));
輸出結果:123456
注 : 在數組遍歷的時候,其實最好不要用 for in,for in 會訪問該對象的原型,查看其原型下是否有屬性,會增加循環額外的壓力。