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来按某种特定顺序来遍历对象对象

相关文章
相关标签/搜索