js for in 在各浏览器差异

来源:互联网 发布:midas软件破解版下载 编辑:程序博客网 时间:2024/05/16 11:29
js for in 在各浏览器差异
var obj = { 
2   2:"2", 
3   40:"40", 
4   15:"15", 
5 }; 
6 for (var k in obj) { 
7     console.log(k);  
8 };
 
ie6/7/8/firefox/safari
2
40
15
ie9/chrome10/opera11
2
15
40


即ie9/chrome10/opera11中不是按定义时的顺序输出的。for in规则参考ecmascript5 12.6.4。


引用the mechanics and order of enumerating the properties (step 6.a in the first algorithm, step 7.a in the second) is not specified
v5已经不再规定for..in的顺序了,所以chrome咋整都没问题
chrome的算法如下:
1、对所有key计算parsefloat的结果
2、将parsefloat为0或正整数的提取出来,从小到大输出
3、将剩下的,按定义顺序输出
ie9我没自己看,好像记得有人说(好像就是教主同志)ie9的顺序和chrome是一样的
另外ie6-8的一个问题:
var o = {};
o['a'] = 1;
o['b'] = 2;
o['c'] = 3;
delete o['a'];
o['a'] = 4;
for (var key in o) {
console.log(key);
}
ie是a-b-c,其他浏览器是b-c-a
如果说一个object里有一个keytable和一个valuetable的话,ie对delete的理解是,把key对应的valuetable里的项砍掉,但keytable保留着,大概就是做了个记号[[deleted]],因此导致再次定义这个key的时候,顺序保持了原来的  
@gray zhang
ie9果然和chrome一样。已修改,谢谢。
有两点:
1,所说chrome算法貌似不对,示例
var obj = {
"1a":"1a",
2:"2",
40:"40",
15:"15"
};
for (var k in obj) {
console.log(k); 
};
chrome下输出 2,15,40,1a。按你所列步骤应该是 1,2,15,40
2,ie6/7/8/9中以下代码都输出a,b,c
var o = {};
o['a'] = 1;
o['b'] = 2;
o['c'] = 3;
delete o['a'];
o['a'] = 4;
for (var key in o) {
console.log(key);

}

JS先驱者都告诫过我们不要对数组对象使用for in语句进行遍历。在遍历数组时,尽量避免使用for in ,而是采用原生的for方法。在遍历对象时,而且对顺序要求不高,可以for in 。

原创粉丝点击