《JavaScript权威指南》第4章 表达式与操作符
- 表达式是可以被求值并产生一个值的JS短语。
- 任何表达式都可以求值为一个JS值。
- 表达式除了产生一个值,也可以有副效应(如变量赋值)。
- 基于简单表达式构建复杂表达式最常见的方式是使用操作符。
- this是面向对象编程中使用的关键字。在方法体中,this求值为调用方法的对象。
- 求值不存在的变量会导致抛出
ReferenceError。
- 数组初始化程序也被称为数组字面量,是一个包含在方括号内的逗号分隔的表达式列表,其中的元素表达式在每次数组初始化程序被求值时也会被求值,这意味着表达式每次求值的结果可能不一样。
- 如果
.和[]左侧表达式求值为null 和undefined会报TypeError,可以使用?.或?.[]语法防止这种错误发生。通过?.访问属性是“短路操作”,如果?.左侧的子表达式求值为null或undefined,那么整个表达式立即求值为undefined,不会再进一步尝试访问属性。
o.m()为常规属性访问,常规调用; o?.m()为条件式属性访问,常规调用;o.m?.()为常规属性访问,条件式调用。
- 变量、对象属性、数组元素都是左值(lval、lvalue),即可以合法地出现在赋值表达式左侧的表达式。
- 赋值操作符
=的优先级最低,属性访问和调用函数表达式的优先级高于操作符。
- ES2020要求在混用
??和||或&&使用时必须加圆括号,同时在求负值和求幂时也必须使用圆括号。
- 幂(
2**2**3===2**8)、一元、赋值和三元条件操作符具有右结合性。
- JS始终按照从左到右的顺序对表达式进行求值。
- 因为JS中所有的数值都是浮点数,所有除法操作得到的都是浮点数。
+操作符优先字符串拼接,++操作符不会执行字符串拼接,而始终会将其操作数转换为数值。
==被认为是隐患,在实践中要坚持使用===和!==。
- 算术操作符不允许
BigInt值与常规值混用,比较操作符允许数值与BigInt值进行比较。
- 字符串比较区分大小写,大写ASCII字母比小写ASCII字母都要小。
- 比较操作符偏向数值,只有两个操作数均为字符串时才按字符串处理。
- 在左侧为真值时,
&&操作符求值并返回它右侧的值。
- 第一个操作数是真值,
||操作符短路直接返回该真值,不再对右侧表达式求值。如果第一个操作数的值是假值,||会求值其第二个操作数并返回该表达式的值。
- 要取得任意值
x对应的布尔值,可使用!!x。
- 先定义操作符
??求值其先定义的操作数,如果其左操作数不是null或undefined,就返回该值。
- typeof无法区分
null和对象,需要显式测试。
void是一个一元操作符,操作数是任意类型,void会求值自己的操作数,然后丢弃这个值并返回undefined。由于操作数会被丢弃,只有在操作数有副效应时才有必要使用void操作符。