邏輯非(!)
- 能夠應用於ECMAScript中的任何值
- 不管這個值是什麼數據範例,這個操縱符都邑返回一個布爾值
- 邏輯非操縱符宰衡會將它的操縱數轉化成一個布爾值,然後對其求反
邏輯與(&&)
- 能夠應用於任何範例的操縱數
- 在有一個操縱數不是布爾值的情況下,邏輯與操縱就不肯定返回布爾值
- 屬於短路操縱
- 不能在邏輯與操縱中應用未定義的值,會致使毛病
邏輯或(||)
- 能夠應用於任何範例的操縱數
- 如果有一個操縱數不是布爾值,邏輯或也不肯定返回布爾值
- 屬於短路操縱
一些其他思索
當同時有邏輯或和邏輯與時,或許同時有多個與操縱和同時有多個或操縱時實行遞次是如何的?
起首明白優先級:! > && > ||
-
NaN && 1 || 0 // 0
:起首實行NaN && 1,效果是NaN,然後實行NaN || 0,終究效果是0 -
NaN || 1 && 0 // 0
:起首實行1 && 0,效果是0,然後實行NaN || 0,終究效果是0 -
1 && NaN && 2 // NaN
:根據從左到右的遞次實行,終究效果是NaN
總結幾個場景
1、邏輯或的應用場景
function test(num) {
var newNum = num || 1
console.log(newNum)
}
test() // 1
test(4) // 4
test(0) // 1
- 傳的是空對象,求值效果為false,返回第二個操縱數
- 傳的是數值4,對象,返回第一個操縱數
- 傳的是數值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
- 第一個操縱數返回undefined,不會對背面的操縱數求值,直接返回undefined
- 第一個操縱數返回“{}”,第二個操縱數返回undefined,直接返回undefined
- 第一個操縱數返回“{num: {}}”,第二個操縱數返回“{}”,第三個操縱數返回undefined,返回第三個操縱數
- 返回末了一個操縱數
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
- 相當於
console.log(undefined||0)
,返回第二個操縱數 - 同上
- 同上
- 相當於
console.log(1||0)
,返回第一個操縱數