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