1

逻辑非(!)

  • 可以应用于ECMAScript中的任何值
  • 无论这个值是什么数据类型,这个操作符都会返回一个布尔值
  • 逻辑非操作符首相会将它的操作数转化成一个布尔值,然后对其求反

逻辑与(&&)

  • 可以应用于任何类型的操作数
  • 在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值
  • 属于短路操作
  • 不能在逻辑与操作中使用未定义的值,会导致错误

逻辑或(||)

  • 可以应用于任何类型的操作数
  • 如果有一个操作数不是布尔值,逻辑或也不一定返回布尔值
  • 属于短路操作

一些其他思考

当同时有逻辑或和逻辑与时,或者同时有多个与操作和同时有多个或操作时执行顺序是怎样的?

首先明确优先级:! > && > ||

  1. NaN && 1 || 0 // 0 :首先执行NaN && 1,结果是NaN,然后执行NaN || 0,最终结果是0
  2. NaN || 1 && 0 // 0:首先执行1 && 0,结果是0,然后执行NaN || 0,最终结果是0
  3. 1 && NaN && 2 // NaN:按照从左到右的顺序执行,最终结果是NaN

总结几个场景

1、逻辑或的运用场景

function test(num) {
    var newNum = num || 1
    console.log(newNum)
}
test()  // 1
test(4) // 4
test(0) // 1

  1. 传的是空对象,求值结果为false,返回第二个操作数
  2. 传的是数值4,对象,返回第一个操作数
  3. 传的是数值0,求值结果是false,返回第二个操作数

2、逻辑与的运用场景

function test(obj) {
    var num = obj && obj.num && obj.num.count
    console.log(num)
}
test() //undefined
test({}) //undefined
test({num: {}}) // undefined
test({num: {count: 1}}) // 1
  1. 第一个操作数返回undefined,不会对后面的操作数求值,直接返回undefined
  2. 第一个操作数返回“{}”,第二个操作数返回undefined,直接返回undefined
  3. 第一个操作数返回“{num: {}}”,第二个操作数返回“{}”,第三个操作数返回undefined,返回第三个操作数
  4. 返回最后一个操作数

3、逻辑与和或的一起运用场景

function test(obj) {
    var num = obj && obj.num && obj.num.count || 0
    console.log(num)
}
test() //0
test({}) //0
test({num: {}}) // 0
test({num: {count: 1}}) // 1
  1. 相当于console.log(undefined||0),返回第二个操作数
  2. 同上
  3. 同上
  4. 相当于console.log(1||0),返回第一个操作数

pitaojin
326 声望36 粉丝