# 什么是表达式语句?
前言
它是由运算符连接变量或者直接量构成的 要么是函数调用,要么是赋值,要么是自增、自减,否则表达式计算的结果没有任何意义
# 赋值表达式左边部分
# PrimaryExpression 主要表达式
- 包含了各种“直接量”
"abc";
123;
null;
true;
false;
- 定义对象,针对函数、类、数组、正则表达式等特殊对象类型
({});
(function(){});
(class{ });
[];
/abc/g;
- this 或者变量,在语法上,把变量称作“标识符引用”
this;
myVar;
# MemberExpression 成员表达式
通常是用于访问对象成员
a.b;
a["b"];
new.target; // 用于判断函数是否是被 new 调用
super.b; // 用于访问父类的属性的语法
# NewExpression NEW 表达式
new new Cls(1);
// 等价于
new (new Cls(1));
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 函数调用表达式
它的基本形式是 Member Expression 后加一个括号里的参数列表
a.b(c);
super();
a.b(c)(d)(e);
a.b(c)[3];
a.b(c).d;
a.b(c)`xyz`;
# LeftHandSideExpression 左值表达式
a() = b;
a().c = b;
# AssignmentExpression 赋值表达式
a = b
a = b = c = d
// 等价于
a = (b = (c = d))
a += b;
// 等价于
a = a + b;
类似的
*=、/=、%=、+=、-=、<<=、>>=、>>>=、&=、^=、|=、**=
# 逗号分隔的表达式
a = b, b = 1, null;
# 赋值表达式右边部分
# 更新表达式 UpdateExpression
-- a;
++ a;
a --
a ++
# 一元运算表达式 UnaryExpression
delete a.b;
void a;
typeof a;
- a;
~ a;
! a;
await a;
# 乘方表达式 ExponentiationExpression
++i ** 30
2 ** 30 //正确
-2 ** 30 //报错
4 ** 3 ** 2
相当于
4 ** (3 ** 2)
# 乘法表达式 MultiplicativeExpression
乘法表达式分别表示乘、除和取余
x * 2;
*/%
# 加法表达式 AdditiveExpression
加法表达式有加号和减号两种运算符
+
-
# 移位表达式 ShiftExpression
二进制操作整数并不能提高性能, 仅仅是照顾 C 系语言用户的习惯
<< 向左移位
>> 向右移位
>>> 无符号向右移位
# 关系表达式 RelationalExpression
<=
>=
<
>
instanceof
in
需要注意,这里的 <= 和 >= 关系运算,完全是针对数字的,所以 <= 并不等价于 < 或 ==。例如:
null <= undefined
//false
null == undefined
//true
# 相等表达式 EqualityExpression(重点)
== // 设计失误
!=
===
!==
# 类型不同的变量比较时==运算只有三条规则
- undefined 与 null 相等;
- 字符串和 bool 都转为数字再比较;
- 对象转换成 primitive 类型再比较
比如:
false == '0' // true
true == 'true' // false
[] == 0 //true
[] == false //true
new Boolean('false') == false // false
# 位运算表达式
- 按位与表达式 BitwiseANDExpression
- 按位异或表达式 BitwiseANDExpression
- 按位或表达式 BitwiseORExpression。
# 逻辑与表达式和逻辑或表达式
# 条件表达式 ConditionalExpression
# 优先级由高到低
← 模拟方法 js继承的方法以及优缺点 →