細談布爾操做符

邏輯非(!)

  • 能夠應用於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),返回第一個操做數
相關文章
相關標籤/搜索