当前位置: 首页 > 科技观察

看了此文,你还敢说你懂了Javascript运算符吗

时间:2023-03-22 02:04:52 科技观察

看完这篇文章,你还敢说你懂Javascript运算符吗?运算符***被执行问题:1||1?2:3;答案:2解析:||的优先级等同于:(1||1)?2:3而不是:1||(1?2:3)1.2关联性:运算符执行的方向。是从左到右还是从右到左问题:+function(){vara=b=1;}();控制台日志(b);控制台日志(一);答案:1错误分析:赋值从右到左,vara=b=1,所以等价于b=1;变量a=b;那么有的同学可能会问,为什么不呢?变量b=1;变量a=b;还记得变量提升吗?变量a=b=1;变量提升时,只会声明a,不会执行赋值中的b。所以如果要声明b,需要遵循语法vara=1,b;现在我们仔细更改优先级问题1||fn()&&fn()MDN是一个高优先级的运算符***被执行,我们都知道||被短路,后面不会执行。那么这个hack被执行的意义何在?1.3短路:&&运算符(a&&b)短路:如果a为假,则b不需要执行||operatorshortcircuit(a||b):如果a为真,b不需要执行问题:1||fn()&&fn()答:1fn不会进行解析:它只是利用了&&运算符的短路原理。说到这里,有的同学会觉得很简单,就是这样,别看到短路就忘了。有的同学可能有点疑惑,不是说优先级高的先执行吗?显然&&具有高优先级。哈哈,不吵了,我们一起看下一题。问题:vara=42;varb="foo";变量c=0;c||刚才说优先的同学可能是一脸懵逼,悄悄不想说话。那么让我们开始今天的学习吧。2绑定定义:优先级高的算子先执行,不是真正的执行,而是更强的绑定。我们用上面两个问题1||fn()&&fn()//&&的优先级高,所以绑定后面的1||(fn()&&fn())//所以相当于1和(fn()&&fn())转到逻辑或1||(fn()&&fn())//我们查表,从左到右进行逻辑或。1||(fn()&&fn())//向左执行,1为真,所以短路,后面不执行问题:vara=42;varb="foo";变量c=0;c||乙?一个:乙;答案:42分析:c|||乙)?一个:乙;//(c||b)等价于条件运算符(c||b)中的条件?一个:乙;//(c||b)值为0,所以值为a那么我们做两道题来巩固题目:vara=5;变量b=5;变量c=5+a+++b;[a,c]答案:[6,15]分析:b=5+a+++b;//查表后自增权重为17,自增前权重为16b=5+(a++)+b;//++优先级高,所以和bindinga绑定在一起b=5+(a++)+b;//按照语法post-increment,先执行语句,再incrementb=5+(a++)+b;//执行语句时,a为5,所以b为15b=5+(a++)+b;//a自增得到6问题:vara=5;变量b=5;varc=++a-b;[a,c]答案:[6,1]解析:varc=++a-b;//查表的预自增权重和一元自减权重都是16,从左到右执行varc=++a-b;//先按照语法pre-increment自增,然后执行语句a=6varc=++a-b;//语句执行时,a为6,所以b为1。看到这里,同学们可能会恍然大悟原来是这样的。别着急,我们来看下一个问题。解决这个问题需要我们理解下一节中的概念。问题:vara=42;varb="foo";变量c=0;一个&&b||C?c||乙?从公式的处理方向,用题说题:分析a&&b&&c的执行顺序:(1)两个运算符都是&&,权重相同。所以这个时间取决于相关性。(2)查表关联&&是从左到右(3)所以表达式应该是(a&&b)&&c问题:a?公元前?d:e的执行顺序分析:(1)两个算子都是条件算子,权重相同。所以这个时间取决于相关性。(2)查表条件运算符的结合性是从右到左(3)所以表达式应该是一个?b:(c?d:e)好了,现在我们可以轻松解决上面的问题了。问题:vara=42;varb="foo";变量c=0;一个&&b||C?c||乙?a:c&&b:a答案:42解析:(a&&b)||C?c||乙?a:(c&&b):a//先查找逻辑,权重为6***((a&&b)||c)?c||乙?a:(c&&b):a//那么逻辑还是((a&&b)||c)?(c||b?a:(c&&b)):a//两个权重相同的条件运算符。Relevance是从右到左,,areyouveryhappy******,说一个疑惑4.顾名思义就是解释和调整疑惑。最好的办法是加上()。如果你能熟练地使用优先级/关联规则,你的代码可以更简洁。很多框架都是这样写的,非常漂亮。但是如果你不确定,那就加(),不要逞强,这才叫对代码的可读性有帮助。