逻辑或
** 寻找第一个真值 **
逻辑或处理每一个逻辑或连接的操作数时,会将其转化为布尔值。如果有值为 true,就停止后面的处理,直接返回这个操作数原值(非转化后的布尔值)。
当所有操作数都是 false,则返回最后一个操作数。
let res = 0 || NaN || undefined || null; => null
逻辑或技巧
- 获取多个值中的第一个真值
let firstName = ""; let lastName = ""; let nickName = "SuperCoder"; alert(firstName || lastName || nickName || "Anonymous"); // SuperCoder
- 短路求值
如果操作数不仅仅是一个值,而是一个有副作用的表达式,例如变量赋值或函数调用,那么这
一特性的重要性就变得显而易见了。
逻辑与
** 寻找第一个假值 **
逻辑与处理每一个逻辑与连接的操作数时,会将其转化为布尔值。如果有值为 false,就停止后面的处理,直接返回这个操作数原值(非转化后的布尔值)。
当所有操作数都是 true,则返回最后一个操作数。
逻辑与
&&
优先级高于逻辑或||
a && b || c && d
等价与(a && b) || (c && d)
逻辑非
运作方式:
- 将操作数转化为布尔值
- 返回相反的布尔值
利用这个特性。可以使用两个连着的逻辑非实现将某个值转化为布尔值:
!!null => false
!!"0" => true
逻辑非优先级高于逻辑与
&&
和逻辑或||
练习
null || -1 && 1
null || 2 && 3 || 4
alert(alert(1) || 2 || alert(3));
alert(alert(1) && alert(2));
答案:
null || -1 && 1 => 1,优先级问题,先计算 - 1 && 1, 结果再参与或运算
null || 2 && 3 || 4 => 3,优先级问题,先计算 2 && 3,表达式变为 null || 3 || 4
alert(alert(1) || 2 || alert(3)); => 先 1,后 2
alert(alert(1) && alert(2)); => 先 1,后 undefined。调用 alert 返回了 undefined
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论。