细谈布尔操做符

逻辑非(!)

  • 能够应用于ECMAScript中的任何值
  • 不管这个值是什么数据类型,这个操做符都会返回一个布尔值
  • 逻辑非操做符首相会将它的操做数转化成一个布尔值,而后对其求反

逻辑与(&&)

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

逻辑或(||)

  • 能够应用于任何类型的操做数
  • 若是有一个操做数不是布尔值,逻辑或也不必定返回布尔值
  • 属于短路操做

一些其余思考

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

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

  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

总结几个场景

一、逻辑或的运用场景

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,返回第二个操做数

二、逻辑与的运用场景

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. 返回最后一个操做数

三、逻辑与和或的一块儿运用场景

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),返回第一个操做数
相关文章
相关标签/搜索