前面学习了表达式的一些结构,其中关于赋值表达式,对它的左边部分(左值表达式)进行了学习,而留下了它右边的部分(右值表达式);
在一些通用的计算机语言设计理论中,能够出现在赋值表达式右边的叫做右值表达式(RightHandSideExpression),而在 JavaScript 标准中,规定了在等号右边的表达式叫做条件表达式(ConditionalExpression),并且在 JavaScript 标准中,右值表达式的字样从没出现过。
JavaScript 标准也规定了左值表达式同时都是条件表达式,此外,左值表达式也可以通过跟一定的运算符组合,逐级构成更复杂的结构,直到成为右值表达式。
对于右值表达式来说,可以理解为以左值表达式为最小单位开始构成的,下面学习左值表达式是如何一步步构成更为复杂的语法结构。如下:
- 更新表达式 UpdateExpression
左值表达式搭配 ++ – 运算符就形成了更新表达式(自增、自减) 一元运算表达式 UnaryExpression
更新表达式搭配一元运算符,可以形成一元运算表达式1
2
3
4
5delete a.b;
void a;
typeof a;
-a;
~a;乘方表达式 ExponentiationExpression
乘方表达式是由更新表达式构成,它使用 ** 符号1
2
3++i ** 20
2 ** 30
(-2) ** 30 或者 -(2 ** 30)并且 ** 运算是右结合的,它跟正常的运算符不一样
1
4 ** (3 ** 2); // 它的执行其实是这样 4 ** (3 ** 2)
乘法表达式 MultiplicativeExpression *、/、%
- 加法表达式 +、-
移位表达式
<<、>>、>>>(无符号右移)
以为运算符把操作数看成二进制表示的整数后进行操作;左移 n 位相当于乘以 2 的 n 次方,右移 n 位相当于除以 2 取整 n 次;而普通的移位会保持正负数,无符号移位会把建好视为符号位 1 同时参与移位,如下:1
-1 >>> 1; // 2147483647 也就是 2 的 31 次方
关系表达式 RelationalExpression
<=、>=、<、>、instanceof、in- 相等表达式
==、!=、===、!===
==和===计算是不太一样的,而类型不同的变量用 == 比较时有如下三条规则:- undefined 与 null 相等
- 字符串和 bool 都转为数字再比较
- 对象转换成 primitive 类型再比较
- 位运算表达式
&(按位与)、|(按位或)、^(按位异或) - 逻辑与和逻辑或表达式
&&、|| - 条件表达式 ConditionalExpression
condition ? expression1 : expression2
总结
这里对表达式右边的部分进行了学习,学到了更新表达式、一元表达式、乘方表达式、乘法表达是等,还有一点就是各表达式的优先级顺序待后续整理。