const obj = {a: 1}
obj["a"] = obj["a"]++
obj // {a: 1}
我理解先是执行 obj['a'] = obj['a']
, 但是 obj 是一个对象,再执行 obj['a']++
为什么不奏效呢?
const obj = {a: 1}
obj["a"] = obj["a"]++
obj // {a: 1}
我理解先是执行 obj['a'] = obj['a']
, 但是 obj 是一个对象,再执行 obj['a']++
为什么不奏效呢?
这个就是i++
和++i
的区别:
const i = 0;
console.log(i++); // 0
const i = 0;
console.log(++i); // 1
所以你的代码中obj['a'] = obj['a']++
等同于
let i = 0;
i = i++;
// ------- 类似伪代码:
i = 0
tmp = i
i = i + 1 // i++
i = tmp // i=
具体计算机的操作,可以尝试着去理解下对应的汇编,寄存器、栈什么的我也是一知半解的,但原理好像就是上面的伪代码
13 回答12.8k 阅读
7 回答2k 阅读
3 回答1.1k 阅读✓ 已解决
2 回答1.2k 阅读✓ 已解决
6 回答928 阅读✓ 已解决
6 回答1.1k 阅读
2 回答1.3k 阅读✓ 已解决
首先要知道 js 对象中的 [[Get]] 和 [[Put]] 操作
我们重新定义一下
obj
对象中对属性a
的getter
和setter
:在每次读取和写入时打印一下
obj.a
的值。然后我们执行问题中的操作:
obj["a"] = obj["a"]++
控制台可以看到输出:
可以看出
obj.a
实际上是读入之后改变后又被修改回来了。如果学习过《深入理解计算机系统》,对寄存器有了初步了解的话你现在应该猜到这个过程应该是怎样的。
大概是这样(cpp 例子):
栈中
-4(%rbp)
当作obj.a
,%edx
、%eax
是寄存器,可以看出:1.把
obj.a + 1
写入edx
然后edx
写入oxj.a
这就是obj.a++
的过程。2.然后把
eax
写入obj.a
,这就是赋值的过程,而值并没有变。