JavaScript语法:什么是表达式语句?
表达式语句实际上就是一个表达式,它是由运算符连接变量或者直接量构成。 一般表达式语句要么是函数调用,要么是赋值,要么是自增,自减,否则表达式的计算结果没有任何意义。但在语法上并没有限制。
PrimaryExpression 主要表达式
表达式的原子项:PrimaryExpress。它是表达式的最小单位,它涉及的语法结构也是优先级最高的。 PrimaryExpression包含各种“直接量”,直接量就是直接用某种语法写出来的具有特定类型的值。比如,数字123,字符串hello world。通俗地讲,直接量就是在代码中把它们写出来的语法。 在类型的部分,已经介绍过一些基本类型的直接量:
123; null; true; false;
除此之外,JavaScript还能够直接量的形式定义对象,针对函数、类、数组、正则表达式等特殊对象类型:
({}); (function(){}); (class{ }); []; /abc/g;
Primary Expression还可以是this或者变量,在语法上,把变量称作“标识符引用”。
this; myVar;
任何表达式加上圆括号,都被认为是Primary Expression,这个机制使得圆括号成为改变运算优先顺序的手段。
(a + b)
MemberExpression 成员表达式
Member Expression通常是用于访问对象成员的。它有几种形式:
a.b; a["b"]; new.target; super.b;
new.target是个新加入的语法,用于判断函数是否是被new调用 super则是构造函数中,用于访问父类的属性的语法。
以下两种为了语法结构需要,在JavaScript中当作Member Expression: 这个是一个带函数的模板,表示把模板的各个部分算好后传递给一个函数。
f`a${b}c`;
带参数列表的new 运算,注意不带参数列表的new运算优先级更低,不属于Member Expression。
new Cls();
NewExpression NEW表达式
Member Expression加上new就是New Expression(当然,不加new也可以构成New Expression,JavaScript中默认独立的高优先级表达式都可以构成低优先级表达式)。 New Expression特指没有参数列表的表达式:
new new Cls(1); // 直观看上去,可能有两个含义: // new (new Cls(1)); // new (new Cls)(1);
实际上它等价于"new (new Cls(1));",1被当作调用Cls时的参数传入了。
class Cls{ constructor(n){ console.log("cls", n); return class { constructor(n) { console.log("returned", n); } } } } new (new Cls(1)); // cls 1 // returned undefined