20200305
Plan
你不知道的 js
Notes
自动分号机制
- 会在换行符处判断是否要加分号
- do while 循环结尾是要加分号的,while 和 for 循环不需要加分号
- 代码块结尾不用加分号
- 这是一种纠错机制,方式 js 解析出错
js 中的错误
- 严格模式下,函数的参数不能重名
function bar(a, b, a) {
"use strict";
console.log(a);
}
bar(); // Error
如果是非严格模式下,访问重名参数只能访问到第二个。第一个可以通过 arguments[0]来访问。
TDZ 死区 Temporal Dead Zone
- 首先 let 不会做声明提升
- 在 let 声明前使用变量会报错,这就是 TDZ
{
a = 2; // 报错
let a;
typeof b; // undefined -- 这里不会报错
let b;
}
函数的参数
- 默认值:不传或传 undefined 都会取默认值
// 区别
function a(b = 1, c = 2) {
console.log("length = ", arguments.length);
console.log("b = %s, c = %s", b, c);
}
a(undefined, undefined); // length = 2, b = 1, c = 2
a(); // length = 0, b = 1, c = 2
- arguments 会和参数产生关联
function foo(a) {
a = 100;
console.log(arguments[0]);
}
foo(3); // 100
foo(); // undefined
foo(undefined); // 100
如果一开始没有传入参数,那么 arguments 不会和参数产生关联。这是在非严格模式下。严格模式下,没有建立关联这一说法。
try finally
- finally 中的 return 会覆盖 try catch 中的 return 的值
function baz(fin) {
try {
return "try";
} catch {
} finally {
return fin;
}
}
baz(); // undefined
baz("finally"); // finally
- finally 中抛出异常,那么调用函数抛出异常
switch
- case 中出现表达式,表达式的结果必须 === 参数
a = "hello";
b = 10;
function foo(c) {
switch (c) {
case a || b == 10:
console.log(c);
break;
default:
console.log("oops");
}
}
foo(a);