下邊就來實踐一下:數組
var obj={'3':'ccc',name:'abc',age:23,school:'sdfds',class:'dfd',hobby:'dsfd'}; Object.keys(obj)
輸出:["3", "name", "age", "school", "class", "hobby"];瀏覽器
換一下對象順序,spa
var obj={name:'abc','3':'ccc',age:23,school:'sdfds',class:'dfd',hobby:'dsfd'}; Object.keys(obj)
輸出:["3", "name", "age", "school", "class", "hobby"]code
因此,對象的遍歷輸出並非按照順序來的,那麼是按照什麼規則來的呢,仔細深刻研究你會發現,這還跟瀏覽器有關係,Chrome跟IE是不同的,因此給出如下結論:對象
Chrome Opera 的 JavaScript 解析引擎遵循的是新版 ECMA-262 第五版規範。所以,使用 for-in 語句遍歷對象屬性時遍歷書序並不是屬性構建順序。
而 IE6 IE7 IE8 Firefox Safari 的 JavaScript 解析引擎遵循的是較老的 ECMA-262 第三版規範,屬性遍歷順序由屬性構建的順序決定。
blog
Chrome Opera 中使用 for-in 語句遍歷對象屬性時會遵循一個規律:
它們會先提取全部 key 的 parseFloat 值爲非負整數的屬性,而後根據數字順序對屬性排序首先遍歷出來,而後按照對象定義的順序遍歷餘下的全部屬性。排序
那麼,解決辦法呢?ip
能夠把對象經過Object.keys提取對象的key出來變成數組,而後經過數組的排序,而後遍歷數組,經過key去取對象的屬性值。io
你們都知道數組的遍歷是按照順序的,那麼當一個數組中放了不少對象,想要按照對象的某個屬性去排序數組須要怎麼處理呢?console
var compare = function (prop) { return function (obj1, obj2) { var val1 = obj1[prop]; var val2 = obj2[prop];if (val1 < val2) { return -1; } else if (val1 > val2) { return 1; } else { return 0; } } }
var arr=[{ name:"wlz", age:25},{ name:"wlz", age:5},{ name:"wlz", age:15},{ name:"wlz", age:3},{ name:"zlw", age:24}]; console.log(arr.sort(compare('age')))
最後這個數組就根據屬性來作排序了。