写在开头:
个人“才疏学浅”,小白一枚,下述内容均为学习过程中的笔记总结与个人感悟,若有错误之处敬请斧正关于标题:标题取为修炼之路一是个人曾经是修仙类小说爱好者,二是偶然间看到过杨逸飞大神所著JavaScript百炼成仙一书有感而发
书接上文,今天来解释一下(仅按个人理解来解释)问题的个中原由:
留一个悬念问题 :上文讲到有一目运算符 后置自增运算为先调用值再自增,后述运算符中又提到有运算符的优先级的问题(++运算符优先级高于赋值运算符),那么请问:
var i = 10,j; j = i++ ;console(j)为何输出的结果是10而不是11,这个结果不是与运算符的优先级顺序相违背吗?
预备知识
JVM指令集
注:
毕竟目前还处于学习前端的入门阶段,因此此处暂时只了解两个与本题概念即可:
局部变量表
局部变量表(Local Variable Table) 是一组变量值存储空间,用于存放方法参数和方法内定义的局部变量
在本题中,局部变量表的作用就是:生成一个储存空间,并将声明的变量名指向这个空间的地址。
说人话就是:你每声明一个变量就会在局部变量表中生成一个可以放东西的盒子。
操作数栈
操作数栈(Operand Stack) 也常称为操作栈,它是一个后入先出栈(LIFO)。
在本题中,操作数栈的作用就是:将代码中的具体数值通过入栈出栈(遵从FILO原则:即先进后出)的操作与局部变量表里的盒子进行联系
说人话就是:把你想要装进盒子里的东西从商店(操作数栈)里买出来再放进盒子里。
具体实现流程
- var i = 10;
此句代码的整体流程:
- var j = i++;
此句代码的整体流程:
解释说明:
从上面的图我们可以很清晰的知道,i++其实是先将i的值10放进了商店(操作数栈),再进行i++运算得到了第二件商品11,并且也将他上架商店(操作数栈);然后依据上文说到的FILO原则
FILO:first in last out ,即先进后出原则(先放进去的商品处于货架的底层,只能买完了他前面的商品最后才能买它),先执行出来的11的商品,买出来以后放进(赋值)i的盒子(局部变量表)里,最后才买10放进j的盒子里面。
结论
只要是一目运算符,例如自增或者自减,无论是前置自增/减还是后置自增/减,其运算的顺序始终都是高于赋值运算符的!!!
结束语
本文仅仅只是个人通过查找相关资料加以自己的理解作出的解答,因此并不能具有权威性,只能帮助理解!!!
码字不易,如若对你有帮助,帮忙给个一键三连,孩子求求了🥺~