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