Javascript 为什么控制台、构造函数声明和属性索引之间存在这种差异?

Javascript 为什么控制台、构造函数声明和属性索引之间存在这种差异?,javascript,Javascript,我现在正在学习构造函数,并决定在JSFIDLE中测试一些东西 我注意到控制台记录obj,按字母顺序显示对象属性 然后我使用Object.keys()通过索引访问属性 根据console.log,我希望索引0是“Jon”,而它给了我“2”,这是声明构造函数的顺序 在浏览器控制台中,它会按声明的方式记录obj,但当您展开对象时,会显示相同的字母顺序 这真是令人困惑 为什么会发生这种情况?如果我通过索引访问属性,是否可以始终确保使用初始属性位置?方法Object.keys()返回给定对象自身可枚举属性

我现在正在学习构造函数,并决定在JSFIDLE中测试一些东西

我注意到控制台记录obj,按字母顺序显示对象属性

然后我使用Object.keys()通过索引访问属性

根据console.log,我希望索引0是“Jon”,而它给了我“2”,这是声明构造函数的顺序

在浏览器控制台中,它会按声明的方式记录obj,但当您展开对象时,会显示相同的字母顺序

这真是令人困惑

为什么会发生这种情况?如果我通过索引访问属性,是否可以始终确保使用初始属性位置?

方法
Object.keys()
返回给定对象自身可枚举属性名称的数组,其迭代顺序与普通循环相同

根据ES 2015规范,对象按以下顺序迭代:

  • 数字数组键,按升序排列
  • 按插入顺序排列的所有其他非符号键
  • 符号键,按插入顺序
  • 方法
    Object.keys
    Object.values
    Object.entries
    ,的顺序,
    for..in
    循环中,ES 2015中未指定
    JSON.stringify
    但是,从ES2020开始,这些方法的属性顺序也将根据上述规则得到保证

    因此,在您的情况下,Object.keys将返回一个数组,其顺序为
    ['number','aName','drink']

    问题的第二部分是console.log的顺序
    console.log
    是浏览器实现,每个浏览器都可以有自己的实现

    以下是一个例子:

    函数createObj(x,y,z,a,b){
    这个[2]=x
    这个数字=y
    this.aName=z
    这饮料
    这个[1]=b
    }
    const obj=新的createObj(1,2,3,4,5)
    控制台日志(obj)
    log(JSON.stringify(obj))
    console.log(Object.keys(obj))
    Object.keys()方法返回给定对象自身可枚举属性名的数组,其迭代顺序与普通循环相同

    根据ES 2015规范,对象按以下顺序迭代:

  • 数字数组键,按升序排列
  • 按插入顺序排列的所有其他非符号键
  • 符号键,按插入顺序
  • 方法
    Object.keys
    Object.values
    Object.entries
    ,的顺序,
    for..in
    循环中,ES 2015中未指定
    JSON.stringify
    但是,从ES2020开始,这些方法的属性顺序也将根据上述规则得到保证

    因此,在您的情况下,Object.keys将返回一个数组,其顺序为
    ['number','aName','drink']

    问题的第二部分是console.log的顺序
    console.log
    是浏览器实现,每个浏览器都可以有自己的实现

    以下是一个例子:

    函数createObj(x,y,z,a,b){
    这个[2]=x
    这个数字=y
    this.aName=z
    这饮料
    这个[1]=b
    }
    const obj=新的createObj(1,2,3,4,5)
    控制台日志(obj)
    log(JSON.stringify(obj))
    
    console.log(Object.keys(obj))
    您从哪里获得ES2020?ES2015引入了该顺序。@Andreas在ES 2015中,该顺序是为某些方法定义的,这些方法迭代属性,而不是
    Object.keys、Object.values、Object.entries、JSON.stringify
    。但是,从ES2020开始,这些方法的属性顺序也将得到保证。您从哪里获得ES2020?ES2015引入了该顺序。@Andreas在ES 2015中,该顺序是为某些方法定义的,这些方法迭代属性,而不是
    Object.keys、Object.values、Object.entries、JSON.stringify
    。但是,从ES2020起,这些方法的属性顺序也将得到保证。
    function constObj(number, name, drink) {
      this.number = number;
      this.aName = name;
      this.drink = drink;
    }
    
    var obj = new constObj(2, "Jon", "Water");
    
    console.log(obj);
    console.log(obj[Object.keys(obj)[0]]);