對象的遍歷輸出並不是按照對象屬性定義順序來的,那么是按照什么規則來的呢,仔細深入研究你會發現,這還跟瀏覽器有關系,Chrome跟IE是不一樣的,所以給出以下結論:
Chrome Opera 的 JavaScript 解析引擎遵循的是新版 ECMA-262 第五版規范。因此,使用 for-in 語句遍歷對象屬性時遍歷書序並非屬性構建順序。而 IE6 IE7 IE8 Firefox Safari 的 JavaScript 解析引擎遵循的是較老的 ECMA-262 第三版規范,屬性遍歷順序由屬性構建的順序決定。
Chrome Opera 中使用 for-in 語句遍歷對象屬性時會遵循一個規律:
它們會先提取所有 key 的 parseFloat 值為非負整數的屬性,然后根據數字順序對屬性排序首先遍歷出來,然后按照對象定義的順序遍歷余下的所有屬性。
那么,解決辦法呢?
可以把對象通過Object.keys提取對象的key出來變成數組,然后通過數組的排序,然后遍歷數組,通過key去取對象的屬性值。
有一些業務要求對對象的各屬性值按照一定順序排列,而給定的對象屬性又不確定能按順序排列(如,數字大小順序)
//************************* JSON對象屬性排序*********************************// //要求傳入參數 JsonData 為JSON對象 //輸出結果為JSON對象
//輸出的對象為按key值升序排列的 function JsonObjSort(JsonData) { if(JsonData) { var JsonKeyArray=new Array(); for(x in JsonData) { var xToInt=parseInt(x); JsonKeyArray.push(xToInt); } JsonKeyArray=JsonKeyArray.sort();//對數組升序排列 var NewJsonStr="" ; for(var i=0;i<JsonKeyArray.length;i++) { if(i>0) { NewJsonStr += ','; } var value = JsonData[JsonKeyArray[i]]; NewJsonStr += '"'+JsonKeyArray[i]+ '"' +':'+value; } var NewJsonStrObj=eval('('+'{'+NewJsonStr+'}'+')'); //console.log(NewJsonStrObj); return NewJsonStrObj ; } else return ""; }