F:后置自增a++为例,编译器处理过程初探

引子

若了解Javascript语言的优先级,你会发现后置自增的优先级是比较高的。那么看下如下例子的比较,他们的控制台输出截然不同。

例子1


let a=1

console.log(a+++a)
//输出3

例子2


let a = 1

console.log( a+a++ )
//输出2

markdown:

  1. 在没有刷新页面的情况下,重复再定义a变量是要报错的

  2. 为什么提这个问题?
    a+++a等同于(a++)+a,而a+a++等同于a+(a++)

  • 不符合预期的结果;
  • 计算机是怎么想的?
       +

     /     \

  /           \

a            a++

编译器的处理过程:

1. push(a), a入栈(1)

2. push(a++),即push(1),之后 a自增变成2

3. result = pop()+pop(), 出栈两个操作数(1,1)相加,得到2

       +

     /     \

  /           \

a++             a

编译器的处理过程:

1. push(a++), 即push(1),之后 a自增变成2

2. push(a),即push(2)

3. result = pop()+pop(), 出栈两个操作数(1,2)相加,得到3

小结

  • a变量的自增虽然仍然遵循运算的优先级,但是进栈也可以笼统视作一种运算。
  • push(a++)先压栈再自增,存入的操作数为1,内存中a自增为2

你可能感兴趣的:(F:后置自增a++为例,编译器处理过程初探)