背景:由于对 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 会访问该对象的原型,查看其原型下是否有属性,会增加循环额外的压力。