《JavaScript权威指南》第4章 表达式与操作符

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