你不知道的JS 中 运算符优先级,TDZ

77 阅读1分钟

5.2 运算符优先级先看一个题吧

    var a = 42;
    var b = 'foo';
    var c = false;
    var d = a && b || c ? c || b ? a : c && b : a;     // 42
代码分解: (( a && b) || c )?( (c || b )? a : (c && b )): a

1). ? :是右关联

a ? b : d ? d : e    // a ? b : (d ? d : e)

2). &&运算符的优先级高于||,||的优先级高于?:

3). 如果想控制运算符的执行顺序,用()

image.png

5.4 TDZ

TDZ(暂时性死区),代码中的变量还没有初始化时不能被引用

try {
      a = 2;
      let a
   } catch (err) {
      console.log(err)  // ReferenceError: Cannot access 'a' before initialization
   }

有意思的是,对未声明变量使用typeof不会产生错误,但在TDZ中会报错

 try {
      typeof a;  //  console.log(typeof a) => undefined
      typeof b;
      let b;
    } catch (err) {
      console.log(err)  //  ReferenceError: Cannot access 'b' before initialization
    }