逻辑非 !

应用于任何值,先将操作数转换成布尔值,再对其求反

规则:实际上先对操作数应用 Boolean() 转换为布尔值,然后再取反

同时使用两个逻辑非操作符,实际上就会模拟 Boolean() 函数的行为,用于将一个值转换为与其对应的布尔值

逻辑与 &&

可以应用于各种类型的操作数,而不仅仅是布尔值

在有一个操作数不是布尔值时,就不一定返回布尔值了

规则:

  • 第一个操作数不是布尔值,则使用 Boolean() 进行转换,是布尔值,则直接判断

  • 结果为 true,则返回第二个操作数

  • 结果是 false,则返回第一个操作数。

短路操作:如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值

  1. var found = true;
  2. var result = (found && someUndefined);//发生错误
  3. alert(result);//这一行不会执行
  4. var found = false;
  5. var result = (found && someUndefined);//不会发生错误
  6. alert(result);//执行结果 false

回调函数:传值是函数时,让函数执行

  1. function fn(callback) {
  2. //=> 如果传递的值是一个函数,我们让其执行
  3. // if(typeod callback === 'function') {
  4. // callback()
  5. // }
  6. callback && callback(); //=> 如果 callback 存在则执行它
  7. //=> 这种写法是不够严谨的,但是经常使用。因为约定好,默认 callback 要不然就传函数,要不然就不传。
  8. }
  9. fn(function() {})

逻辑或 ||

规则:

  • 第一个操作数不是布尔值,则使用 Boolean() 进行转换,是布尔值,则直接判断

  • 结果为 true,则返回第一个操作数

  • 结果是 false,则返回第二个操作数

短路操作:如果第一个操作数的求值结果为 true,那么就不会再对第二个操作数求值

赋值语句经常采用这种模式:可以给参数赋默认值

  1. var myObject = preferredObject || backupObject;

虽然不够严谨,但是在真实项目中约定俗称,经常使用。因为默认要么不传值,要么传递的就是所需要的值。所以在需要传递的值为假的时候,应该避免这种默认值定义方式

ES6 新语法规范中可以直接给形参设置默认值:

  • 一旦传递值,除了 undefined,都是按传递的值给形参赋值

  • 如果不传递参数,或者传递的是 undefined,那么给形参赋值默认值

  1. function fn(x=0) {
  2. console.log(x);
  3. }
  4. fn(); //=> 0
  5. fn(null); //=> null
  6. fn(undefined); //=> 0

优先级

优先级从高到底:

  • 逻辑非

  • 逻辑与

  • 逻辑或

  1. 0 || 1 && 2 || 0 || 3 && 2 || 1; //=> 2