句子:句子是由短语组成,短语是由更小的短语或单词组成。
在 JS 中,语句相当于句子,表达式相当于短语,运算符相当于标点符号。
声明表达式,赋值表达式,表达式语句的区别
控制台显示的就是语句的结果值。在~~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,所以如下代码是正确的

- 链式赋值
a = b = c = 42 - 可以将赋值语句的副作用优化代码
上下文规则
{…} 结构赋值
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 来捕获)。所有语法错误都是早期错误,程序有语法错误则无法运行。
- 早期错误无法被捕获是什么意思 ?
- 所有的语法错误是早期错误,那么什么样的错误是运行时错误呢 ?
- 上面说的是语法错误,那么是词法错误呢? :::
附录补充
