前言
题目如下:
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);
在此之前需要先了解 JS 对象键的排序问题,JS会对对象的属性进行处理,把所有 Number类型 和 数字字符串 的属性提前,然后按照数字升序排序。
如下面代码,对象键的顺序并非声明顺序
另一篇文章也有介绍关于对象键的排序问题:对象遍历时属性顺序与定义时不一致
分析
-
const obj = { a: 0 }
-
obj['1'] = 0
- 此时obj为 { ‘1’: 0, a: 0 }
-
obj[++obj.a] = obj.a++
- ++obj.a 后,左侧表达式为 obj[1] ,此时obj为 { ‘1’: 0, a: 1 }
- obj.a++ 后,右侧表达式为1,此时obj为 { ‘1’: 0, a: 2 }
- 然后将obj[1] 赋值为1,此时obj为 { ‘1’: 1, a: 2 }
-
const values = Object.values(obj)
- values 为
[1,2]
- values 为
-
obj[values[1]] = obj.a
- obj[2] = obj.a ,此时obj为 { ‘1’: 1, ‘2’: 2, a: 2 }
结果