前些日子刷抖音看到了这么一道题,尝试做了一下也做错了,后面才了解,原来对象不同的属性是有一定的顺序的,且跟添加顺序还有这千丝万缕的关系
就是下面这道题
const obj = {
a: 0,
};
obj["1"] = 0;
obj[++obj.a] = obj.a++;
const values = Object.values(obj);
obj[values[1]] = obj.a;
console.log(obj);
可以先做一下,看看结果是多少
下面将一步一步讲解,最后得出结果
声明一个对象不多说
const obj = {
a: 0,
};
添加一个属性 key 为 1,value 为 0 的属性,需要注意的是属性都是字符串没有数字(Symbol不考虑,这里也没涉及)
ps:并且还有一个知识点,内容为数字类型的 key 罗列出来时,会排在其他类型之前,且按照升序排列,其他的按照添加顺序排列
obj["1"] = 0;
//此时的obj
{
1: 0,
a: 0
}
++a 和 a++ 的操作,学过c语言的都知道,他们都是对 a 自增1,不同的是 a++ 返回的是自增前的结果,++a返回的是自增后的结果
//由于 obj.a 为 0 翻译过来也就是
//这里需要注意的,代码从左往右执行,最后赋值表达式在最后,那时候才是右边结果赋值给左侧
// obj[++a] = a++ 也就是,从左往右翻译表达式 obj[1] = 1
obj[++obj.a] = obj.a++;
//此时的obj
{
1: 1,
a: 2
}
Object.values 罗列 values 内容,并且按照前面说的按照数字类型升序,其他按照添加顺序排列
const values = Object.values(obj);
//参考上一步结果,下面则可以翻译为 obj[2] = 2
obj[values[1]] = obj.a;
//此时的obj
{
1: 1,
2: 2
a: 2
}
因此最后一行的结果就是
console.log(obj);
//打印结果就是 obj 的对象,按照指定规则排列打印就是它了
//由于数字这里也只能表示字符串,js打印结果还专门标出来引号怕被误解
{ '1': 1, '2': 2, a: 2 }