右值表达式

前面学习了表达式的一些结构,其中关于赋值表达式,对它的左边部分(左值表达式)进行了学习,而留下了它右边的部分(右值表达式);
在一些通用的计算机语言设计理论中,能够出现在赋值表达式右边的叫做右值表达式(RightHandSideExpression),而在 JavaScript 标准中,规定了在等号右边的表达式叫做条件表达式(ConditionalExpression),并且在 JavaScript 标准中,右值表达式的字样从没出现过。
JavaScript 标准也规定了左值表达式同时都是条件表达式,此外,左值表达式也可以通过跟一定的运算符组合,逐级构成更复杂的结构,直到成为右值表达式。
对于右值表达式来说,可以理解为以左值表达式为最小单位开始构成的,下面学习左值表达式是如何一步步构成更为复杂的语法结构。如下:

  • 更新表达式 UpdateExpression
    左值表达式搭配 ++ – 运算符就形成了更新表达式(自增、自减)
  • 一元运算表达式 UnaryExpression
    更新表达式搭配一元运算符,可以形成一元运算表达式

    1
    2
    3
    4
    5
    delete 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

总结

这里对表达式右边的部分进行了学习,学到了更新表达式、一元表达式、乘方表达式、乘法表达是等,还有一点就是各表达式的优先级顺序待后续整理。