js中對象的輸出順序

前言:最近用for-in時,看到說for-in不能保證遍歷的對象順序,對此有些疑問,因而便研究了下,本文作簡要說明。chrome

現象

let obj = {
    a: 'a',
    b: 'b',
    1: 1,
    2: 2
}
let obj2 = {
    name: '張三',
    age: 13,
    gender: 'male'
}
for(key in obj){
    console.log(key)
}
// 輸出順序爲1,2,a,b
for(key in obj2){
    console.log(key)
}
// 輸出的順序爲name,age,gender

能夠發現,for-in的迭代順序不是按定義對象時的順序(其實不須要for-in,直接輸出對象或用Object.keys遍歷都是同樣的效果)瀏覽器

console.log(obj)// {1: 1, 2: 2, a: "a", b: "b"}
console.log(Object.keys(obj))// ["1", "2", "a", "b"]

那若是不是按定義的順序,是按什麼順序呢?看obj1像是ASC碼升序遍歷,但看obj2又不是。測試

結論

根據http://w3help.org/zh-cn/causes/SJ9011能夠得知code

  • 不一樣版本的ECMA規範,for-in的遍歷順序的的標準不同:ECMA-262(ECMAScript)第三版中,遍歷順序爲對象定義時屬性的書寫順序決定的;最新的 ECMA-262(ECMAScript)第五版中,遍歷順序沒有被規定。不一樣的瀏覽器引擎採用的規範可能不一樣,因此輸出的順序也就不同
  • Chrome Opera 中使用 for-in 語句遍歷對象屬性時會遵循一個規律,它們會先提取全部 key 的 parseFloat 值爲非負整數的屬性, 而後根據數字順序對屬性排序首先遍歷出來,而後按照對象定義的順序遍歷餘下的全部屬性。其它瀏覽器則徹底按照對象定義的順序遍歷屬性。

說明:以上第二點,我在IE瀏覽器中測試過,並非按對象定義的順序輸出,而是和chrome表現同樣,都是按上部分【現象】中的表現輸出。
結論:雖然沒能徹底肯定for-in的遍歷順序,但能夠知道此順序不是惟一的,在不一樣的環境下可能會有不能的表現,因此咱們不能依賴for-in來按某種特定順序來遍歷對象對象

相關文章
相關標籤/搜索