刷到的一个对象知识点一个题

242 阅读2分钟

前些日子刷抖音看到了这么一道题,尝试做了一下也做错了,后面才了解,原来对象不同的属性是有一定的顺序的,且跟添加顺序还有这千丝万缕的关系

就是下面这道题

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 }