【www.gdgbn.com--浏览器】

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);
}  

本文来源:http://www.gdgbn.com/bangongshuma/29657/