[TOC]

句子:句子是由短语组成,短语是由更小的短语或单词组成。
在 JS 中,语句相当于句子,表达式相当于短语,运算符相当于标点符号。
image.png
声明表达式,赋值表达式,表达式语句的区别
控制台显示的就是语句的结果值。在~~JS ~~(规范)中的定义里,var 返回的是 undefined,所以只要用 var 声明的 声明式语句结果值 都是 undefined。
如何获取语句的结果值。

// 尽量不要使用
a = eval( "if (true) { b = 4 + 38; }" );

// 在 chrome 里面尝试好像并不会生效
a = do {
    if (true) { b = 4 + 38; }
}

表达式副作用

  • 函数如果没有return,返回值永远是 undefined.
  • 递增和递减。
  • var a = (1,2,3) 返回值是3,所以如下代码是正确的

image.png

  • 链式赋值 a = b = c = 42
  • 可以将赋值语句的副作用优化代码

上下文规则

{…} 结构赋值
image.png
if() {} else if {} 实际上是 if() else {if(){}}的简化版,因为if单条语句不需要加括号,所以这是开发者简化的版本,不在JS 语法规范畴内。

运算符优先级

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence

7 逻辑与 (&&) 从左到右 … && …
6 逻辑或 (||) 从左到右 … || …
5 空值合并 (??) 从左到右 … ?? …
4 条件(三元)运算符 从右到左 … ? … : …

空值合并

var isNull = null
const foo = isNull ? isNull : 'default string';
const foo1 = isNull ?? 'default string';

如果运算符优先级 / 关联规则能够令代码更为简洁,就使 用运算符优先级 / 关联规则;而如果 ( ) 有助于提高代码可读性,就使用 ( ) 。

自动分号插入(ASI)

只在换行符处起作用,并不会在代码的中间插入分号。

错误

词法错误?语法错误。
在编译阶段发现的错误叫做语法错误
运行阶段发现的错误。执行代码,生成上下文时发现的错误。

提前使用变量(TDZ)

暂时性死区

{
    let a = 2;
    let b = a+b+4;
}
//Uncaught ReferenceError: Cannot access 'b' before initialization
function foo(a){
    a = 42;
    console.log(arguments[0])
}
foo() // 输出 undefined。 arguments 只关注入场的值,

function foo(a){
    arguments = [1,2,3]
    console.log(arguments[0])
}
foo() // 1。重新赋值可以

try… finally

try finally 无论出现什么情况一定会被调用 并且是finally 中的代码先调用,再去调用 try 中的代码。

:::warning JavaScript 中有很多错误类型, 分为两大类:早期错误(编译时错误, 无法被捕获)和运行时错误(可以通过 try..catch 来捕获)。所有语法错误都是早期错误,程序有语法错误则无法运行。

  • 早期错误无法被捕获是什么意思 ?
  • 所有的语法错误是早期错误,那么什么样的错误是运行时错误呢 ?
  • 上面说的是语法错误,那么是词法错误呢? :::

附录补充