20200305

@xiaojingzhao

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

  1. 首先 let 不会做声明提升
  2. 在 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);

More