zoukankan      html  css  js  c++  java
  • foreach遍历自定义数据对象在各个浏览器下的顺序差异

        曾经听说,foreach的顺序是无法保证的,但同一对象在同一浏览器下遍历的顺序是固定的。

        现在有需要通过foreach按一定顺序地遍历对象的成员(数据对象,key-value形式),所以做了一个小测试,测试各个浏览器顺序的差异。

        结论:

        IE6、IE7、IE8、Firefox、Safari是按照对象属性的初始化顺序来遍历的,与key的类型无关。

               IE9、Chrome、Opera、360浏览器、遨游、搜狗浏览器、QQ浏览器,会对纯数字字符进行排序,输出顺序初步归纳如下:先纯数字字符,再其他;数字按照实际值由小到大输出;其他字符串按照初始化顺序输出。

        由于我当时需要遍历的对象key是数字,这样在不同浏览器下面,数据出现的顺序会不一致。根据上面的测试结果,如果想统一他们的顺序,可以让纯数字字符变为混合字符,如在前面加下划线等等。


        以下是测试代码:

    <!DOCTYPE html>
    <html>
    <head>
        <title>test</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    </head>
    <body>
    <script type="text/javascript">
        var obj1 = {};
        obj1["12"] = "";
        obj1["1"] = "";
        var tmp1 = "数字字符当key,      12:先,1:后  foreach结果:";
        for (var name in obj1) {
            tmp1 += obj1[name];
        }
    
        var obj2 = {};
        obj2["1"] = "";
        obj2["12"] = "";
        var tmp2 = "数字字符当key,将key-value交叉对调,      1:先,12:后  foreach结果:";
        for (var name in obj2) {
            tmp2 += obj2[name];
        }
        
        var obj3 = {};
        obj3["cd"] = "";
        obj3["a"] = "";
        var tmp3 = "英文字符当key,     cd:先,a:后  foreach结果:"
        for (var name in obj3) {
            tmp3 += obj3[name];
        }
    
    
        var obj4 = {};
        obj4["cd"] = "";
        obj4["a"] = "";
        var tmp4 = "英文字符当key,将key-value交叉对调    a:先,cd:后  foreach结果:"
        for (var name in obj4) {
            tmp4 += obj4[name];
        }
    
        var obj5 = {};
        obj5["_2"] = "";
        obj5["_1"] = "";
        var tmp5 = "符号+数字当key,   _2:先,_1:后  foreach结果:"
        for (var name in obj5) {
            tmp5 += obj5[name];
        }
    
        var obj6 = {};
        obj6["_2"] = "";
        obj6["_1"] = "";
        var tmp6 = "符号+数字当key,将key-value交叉对调   _1:先,_2:后  foreach结果:"
        for (var name in obj6) {
            tmp6 += obj6[name];
        }
    
        var obj7 = {};
        obj7["1"] = "";
        obj7["a"] = "";
        var tmp7 = "纯数字字符、纯英文字符当key,   1:先,a:后  foreach结果:"
        for (var name in obj7) {
            tmp7 += obj7[name];
        }
    
        var obj8 = {};
        obj8["1"] = "第一";
        obj8["12"] = "第二";
        obj8["3"] = "第三";
        obj8["a1"] = "第四";
        obj8["1a"] = "第五";
        obj8["a"] = "第六";
        obj8["zzz"] = "第七";
        var tmp8 = "纯数字字符、混合字符、纯英文字符   1:第一,12:第二,3:第三,a1:第四,1a:第五,a:第六,zzz:第七    foreach结果:"
        for (var name in obj8) {
            tmp8 += obj8[name];
        }
    
        var obj9 = {};
        obj9["zzz"] = "第一";
        obj9["1"] = "第二";
        obj9["12"] = "第三";
        obj9["a"] = "第四";
        obj9["3"] = "第五";
        obj9["a1"] = "第六";
        obj9["1a"] = "第七";
    
        var tmp9 = "纯数字字符、混合字符、纯英文字符 zzz:第一,1:第二,12:第三,a:第四,3:第五,a1:第六,1a:第七     foreach结果:"
        for (var name in obj9) {
            tmp9 += obj9[name];
        }
        document.write(tmp1 + "<br/>" + tmp2 + "<br/>" + tmp3 + "<br/>" + tmp4 + "<br/>" + tmp5 + "<br/>" + tmp6 + "<br/>" + tmp7 + "<br/>" + tmp8 + "<br/>" + tmp9 + "<br/>");
    </script>
    </body>
    </html>

    以下是测试结果截图:

  • 相关阅读:
    NFS安装配置与客户端的优化参数
    DELL硬件防火墙配置
    华为交换机命令
    lvs + keepalive的安装配置
    IPVS 的管理
    奇葩的404报错
    js 程序出发事件
    jvm 参数
    策略模式代替大量的if else
    采购订单行类型校验规则
  • 原文地址:https://www.cnblogs.com/lcllao/p/2455721.html
Copyright © 2011-2022 走看看