逻辑非(!)
- 可以应用于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)
,返回第一个操作数
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。