js -- 逻辑运算符
js有三种逻辑运算符:||(或),&&(与),!(非)。
他们可以用于任何数据类型,结果也可以是任意类型。
三种运算符会将操作数转化为boolean值再参与运算。
返回的值是操作数的初始形式,不会做布尔转换。
||(或)运算符
语法: let result = value1 || value2 || value13
返回第一个真值,真值之后的操作数不再执行。
例如:
let a = true||false
let b = false || true
let res = 0
function sum() { res = 3+4 }
(1 + 2) || sum()
a // true
b //true
res // 0
如果操作数都不是真值,返回最后一个操作数。
例如:
let a = 0 || false || null
a // null
&& (与)运算符
语法: let result = value && value1 && value2
总是返回第一个假值。假值之后的操作数不再执行。
例如:
let a = 1 && 0 && 1
let b = 0 && 1 && 1
let res = 0
function sum() { res = 3+4 }
1-1 && sum()
a // 0
b // 0
res // 0
如果都为真值,返回最后一个操作数。
例如:
let a = 1 && 6 && 9
a // 9
&& 可以简化if (不建议这样使用,可读性不好)
例如:
let x = 1
x>0 && console.log(x)
// 1
!(非)运算符
语法:let result = ! value
!运算符会任意值转化为布尔值并取反。
例如:
let a = !1
let b = !false
a // false
b // true
可以使用!!将一个任意值转化为布尔值。
(类似于Boolean())
例如:
let a = !!null
let b = !!true
a // false
b // true
优先级
非运算符 ! 的优先级在所有逻辑运算符里面最高,所以它总是在 && 和 || 之前执行。
&& 优先级比||优先级高。
例如:
1 && 2 || 3 && 4 等同于 (1&&2) || (3 && 4)
??空值合并运算符
语法: let result = value ?? value1
如果value不为null或undefined则返回value,否则返回value1。
例如:
let a = null
let b = undefined
let c = 0
a ?? 'a' // 'a'
b ?? 'b' // 'b'
c ?? 'c' // 0
??与 || 可以以相同的方式使用,但||无法区分false、0、空字符串 和 null/undefined。
例如:
let a = fasle
let b = 12
a || '||' // '||'
a ?? '??' // fasle
b || '||' // 12
b ?? '??' // 12
?? 运算符的优先级相当低 。 在= 和 ?: 之前计算,但在+ 和 *等之后计算。
例如:
0??2 ?'111':'222'
// '222'
1-1 ?? '0000'
// 0
js禁止将&& 和 || 运算符一起使用,除非使用括号明确指定了优先级。
例如:
let x = 1 && 2 ?? 3 // Uncaught SyntaxError: Unexpected token '??'
let y = (1 && 2) ?? 3
y //2