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