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
CallExpression 函数调用表达式
除了New Expression,Member Expression还能构成Call Expression。基本形式是在Member Expression后加一个括号里的参数列表,或者可以用上super关键字代替Member Expression。
a.b(c);
以下是一些变体,跟Member Expression几乎是一一对应的。可以理解为,Member Expression中的某一子结构具有函数调用,那么整个表达式就成为了一个CallExpression。CallExpression就失去了比 NewExpression优先级高的特性。
LeftHandSideExpression 左值表达式
New Expression 和 Call Expression 统称为LeftHandSideExpression,左值表达式
左值表达式就是可以放到等号左边的表达式。JavaScript语法是下边这样的:
a() = b;
这样的用法是符合语法的,只是,原生JavaScript函数,返回的值都不能被赋值。因此,我们多数的时候,我们看到的赋值将会是Call Expression的其他形式:
a().c = b;
根据JavaScript运行时的设计,不排除某些宿主会提供返回引用类型的函数,这时候赋值就是有效的了。
左值表达式最经典的用法就是构成赋值表达式。
此文章为7月Day14学习笔记,内容来源于极客时间《重学前端》,日拱一卒,每天进步一点点💪💪
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。