JavaScript修炼之路 --- (一看就懂)自增运算符与操作数栈、局部变量表间的那些事!

1,268 阅读3分钟

写在开头:
个人“才疏学浅”,小白一枚,下述内容均为学习过程中的笔记总结与个人感悟,若有错误之处敬请斧正

关于标题:标题取为修炼之路一是个人曾经是修仙类小说爱好者,二是偶然间看到过杨逸飞大神所著JavaScript百炼成仙一书有感而发


书接上文,今天来解释一下(仅按个人理解来解释)问题的个中原由:

上文地址:JavaScript修炼之路 --- 练气段、js的相关语法

留一个悬念问题 :上文讲到有一目运算符 后置自增运算为先调用值再自增,后述运算符中又提到有运算符的优先级的问题(++运算符优先级高于赋值运算符),那么请问:
var i = 10,j; j = i++ ;console(j)为何输出的结果是10而不是11,这个结果不是与运算符的优先级顺序相违背吗?


预备知识

JVM指令集

注:
毕竟目前还处于学习前端的入门阶段,因此此处暂时只了解两个与本题概念即可:

局部变量表

局部变量表(Local Variable Table) 是一组变量值存储空间,用于存放方法参数和方法内定义的局部变量

在本题中,局部变量表的作用就是:生成一个储存空间,并将声明的变量名指向这个空间的地址。

说人话就是:你每声明一个变量就会在局部变量表中生成一个可以放东西的盒子。

操作数栈

操作数栈(Operand Stack) 也常称为操作栈,它是一个后入先出栈(LIFO)。

在本题中,操作数栈的作用就是:将代码中的具体数值通过入栈出栈(遵从FILO原则:即先进后出)的操作与局部变量表里的盒子进行联系

说人话就是:把你想要装进盒子里的东西从商店(操作数栈)里买出来再放进盒子里。

具体实现流程

  1. var i = 10;

此句代码的整体流程:

图片.png

  1. var j = i++;

此句代码的整体流程:

图片.png

解释说明:

从上面的图我们可以很清晰的知道,i++其实是先将i的值10放进了商店(操作数栈),再进行i++运算得到了第二件商品11,并且也将他上架商店(操作数栈);然后依据上文说到的FILO原则 FILO:first in last out ,即先进后出原则(先放进去的商品处于货架的底层,只能买完了他前面的商品最后才能买它),先执行出来的11的商品,买出来以后放进(赋值)i的盒子(局部变量表)里,最后才买10放进j的盒子里面。

结论

只要是一目运算符,例如自增或者自减,无论是前置自增/减还是后置自增/减,其运算的顺序始终都是高于赋值运算符的!!!

结束语

本文仅仅只是个人通过查找相关资料加以自己的理解作出的解答,因此并不能具有权威性,只能帮助理解!!!


码字不易,如若对你有帮助,帮忙给个一键三连,孩子求求了🥺~