zoukankan      html  css  js  c++  java
  • js中对象的输出顺序

    前言:最近用for-in时,看到说for-in不能保证遍历的对象顺序,对此有些疑问,于是便研究了下,本文做简要说明。

    现象

    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可以得知

    • 不同版本的ECMA规范,for-in的遍历顺序的的标准不一样:ECMA-262(ECMAScript)第三版中,遍历顺序为对象定义时属性的书写顺序决定的;最新的 ECMA-262(ECMAScript)第五版中,遍历顺序没有被规定。不同的浏览器引擎采用的规范可能不同,所以输出的顺序也就不一样
    • Chrome Opera 中使用 for-in 语句遍历对象属性时会遵循一个规律,它们会先提取所有 key 的 parseFloat 值为非负整数的属性, 然后根据数字顺序对属性排序首先遍历出来,然后按照对象定义的顺序遍历余下的所有属性。其它浏览器则完全按照对象定义的顺序遍历属性。

    说明:以上第二点,我在IE浏览器中测试过,并不是按对象定义的顺序输出,而是和chrome表现一样,都是按上部分【现象】中的表现输出。
    结论:虽然没能完全确定for-in的遍历顺序,但可以知道此顺序不是唯一的,在不同的环境下可能会有不能的表现,所以我们不能依赖for-in来按某种特定顺序来遍历对象

  • 相关阅读:
    [LeetCode]Sliding Window Maximum
    判断两根线段是否相交
    求幂,我居然又没做出来
    C++集合运算函数总结 & 需要有序集合的操作
    effective stl读书笔记 & stl里面提供的算法 & emplace & ostream_iterator
    利用位操作的几道题目
    C++的new_handler
    TCP的可靠性 窗口滑动 拥塞控制
    关于高性能网络编程的一些知识
    三种连接 & DOS & SYNFLOOD & 防御
  • 原文地址:https://www.cnblogs.com/youhong/p/10840440.html
Copyright © 2011-2022 走看看