Netherspite

表达式语句是由运算符连接变量或者字面量构成的。一般来说,表达式语句要么是函数调用,要么是赋值,要么是自增、自减,否则表达式计算的结果没有意义。而在语法角度,任何合法的表达式都可以当做表达式语句使用,只是结果没有任何意义,比如a+b;,这是一个表达式语句,计算了a+b的值,但是不会显示也不会产生任何执行效果。

表达式

PrimaryExpression

主要表达式是表达式的最小单位,它涉及的语法结构优先级最高。其包含了各种字面量,以及this或者标识符(变量)。任何表达式加上圆括号都被认为是主要表达式,这个机制使得圆括号称为改变运算优先顺序的手段。

MemberExpression

成员表达式通常适用于访问对象成员的。主要有以下形式:

  • a.b
  • a[‘b’]
  • new.target
  • super.b
  • f`a${b}c`
  • new cls();

NewExpression

成员表达式加上new就是NewExpression,这里的NewExpression特指没有参数列表的表达式。

new new cls(1);
new (new cls(1));
new (new cls)(1);

实际上以上三种写法是等价的,1会被当做调用cls时的参数传入,而cls返回的class再调用new不会有参数传入。

CallExpression

成员表达式还能构成调用表达式。基本形式是成员表达式后加一个括号里的参数列表,或者用上super关键字代替成员表达式。

a.b(c);
super();
a.b(c)(d)(e);
a.b(c)[3];
a.b(c).d;
a.b(c)`xyz`;

成员表达式中的某一子结构具有函数调用,那么整个表达式就成为了一个调用表达式。

LeftHandSideExpression

NewExpression和CallExpression统称LeftHandSideExpression,左值表达式。

a() = b;
a().c = b;

上述的第一行用法是符合语法的,但是原生的javascript函数返回的值都不能被赋值。所以往往看到的是上述第二行的形式。左值表达式最经典的用法是用于构成赋值表达式。

AssignmentExpression

赋值表达式最基本的就是使用等号赋值,等号可以嵌套,连续赋值遵循右结合的规则。赋值表达式还能结合一些运算符(+=等)。

Expression

赋值表达式可以构成Expression表达式的一部分。Expression就是用逗号运算符连接的赋值表达式。逗号运算符的优先级比赋值运算优先级还要低。export后只能跟赋值表达式,即表达式中不能含有逗号。

UpdateExpression

左值表达式搭配++ –运算符,形成更新表达式。更新表达式会改变一个左值表达式的值。

UnaryEpression

更新表达式搭配一元运算符,形成一元运算表达式。

delete a.b;
void a;
typeof a;
- a;
~ a;
! a;
await a;

ExponentiationExpression

乘方表达式是由更新表达式构成的,使用**号。**是右结合的,与其他运算符是左结合的不一样。如4 ** 3 ** 2的结果是262144,即先计算3的2次方再计算4的9次方。

MultiplicativeExpression

乘方表达式可以构成乘法表达式,用称号或者除号、取余符号连接。这三个符号的优先级是一致的。

AdditiveExpression

加法表达式是由乘法表达式用加号或者减号连接构成的。

ShiftExpression

移位表达式由加法表达式构成,移位分成左移(<<)、右移(>>)和无符号右移(>>>)。

RelationalExpression

移位表达式可以构成关系表达式,包括:<=>=<>instanceofin

EqualityExpression

语法上,相等表达式是由关系表达式用相等比较运算符连接构成的。类型不同的变量比较时==运算遵循三条规则:

  • undefined与null相等
  • 字符串和boolean转换成数组再比较
  • 对象转换成primitive再比较

位运算表达式

按位与、按位或和按位异或三种,按位与表达式由按位与运算符连接按位异或表达式构成,按位异或表达式由按位异或运算符连接按位与表达式构成,按位或表达式由按位或运算符连接相等表达式构成。

逻辑与表达式和逻辑表达式

逻辑与表达式由按位或表达式经过逻辑与运算符连接构成,逻辑或表达式由逻辑与表达式经逻辑或运算符连接构成。这两种表达式都不会做类型转换,比如

false || 1;					//得到1
true && undefined; //得到undefined

ConditionalExpression

条件表达式由逻辑或表达式和条件运算符(三目运算符)构成。条件表达式实际上就是javascript中的右值表达式了。

运算符优先级总结

运算符 优先级 结合性
() 1
. / [] 成员运算符 2
new 3
()函数调用 4
++ – 5
+ - ~ ! delete typeof void await 一元运算符 6
** 7
* / % 8
+ - 二元运算符 9
<< >> >>> 10
< > <= >= instance of in 11
== === != !== 12
& 13
^ 14
| 15
&& 16
|| 17
?: 18
= 19
, 20

 评论