"!!"或 if 将表达式进行强制转化为 bool 值的运算,运算结果为 true 或者 false
注意:以下进行布尔值运算是为 false
- undefined(未定义,找不到值时出现)
 - Null(代表空值)
 - False(布尔值的 false,字符串"false"布尔值为 true)
 - 0、-0(字符串"0"布尔值为 true)
 - NaN
 - “”(双引号)或’'(单引号) (空字符串,中间有空格时也是 true)
 
逻辑或
console.log(true || true)   // true  
console.log(false || true)  // true  
console.log(true || false)  // true  
console.log(false || false || '') // ''
 
当第一项为 true 时,则返回第一项的值,后面的不做判断;
 当第一项为 false 时,若后一项为 true,则返回后一项,若后一项为 false,则继续判断后一项,若全部为 false,则返回最后一项的值
其他用法:
let a={name:'苏'}  
console.log(1|| false || '') // 1  
console.log(0|| false || ' ') // ' '  
console.log(0|| a.name || ' ') // 苏
 
甚至能和表达式一起使用:
console.log(10 < 9 || '学徒') //学徒  
console.log(0 || '' || undefined || NaN || demo() + 1)//18  
function demo() {  
  return 17  
}
 
逻辑与
两个操作数都是真值时,与运算返回 true,否则返回 false
console.log( true && true );   // true  
console.log( false && true );  // false  
console.log( true && false );  // false  
console.log( false && false ); // false
 
多个操作数时:
let result = 6 && 8 && '苏苏'  
let result1 = 6 && 0 && '苏苏'  
let result2 = 0||undefined||NaN  
console.log(result)//苏苏  
console.log(result1)//0  
console.log(result2)//NaN
 
与运算 && 做了如下的运算:
- 从左到右依次计算操作数。
 - 在处理每一个操作数时,都将其转化为布尔值。如果遇到某一个操作值为 false,则停止后面的判断,返回该操作数的初始值;
 - 如果所有的操作数进行布尔运算都为 true,则返回最后一个操作数。
 
注意:
-  
与运算
&&的优先级比或运算||要高
所以代码 a && b || c && d跟&&表达式加了括号完全一样:(a && b) || (c && d) `。 -  
非运算符
!的优先级在所有逻辑运算符里面最高,所以它总是在&&和||之前执行。. 
逻辑非运算符
逻辑非运算符接受一个参数,并按如下运作:
- 将操作数转化为布尔类型:
true/false。 - 返回相反的值。
 
**两个非运算 !! 有时候用来将某个值转化为布尔类型,等同于:Boolean 函数
console.log( Boolean("non-empty string") ); // true 
console.log( Boolean(null) ); // false
 
空值合并运算符
这是一个 es 2020 新出的一个特性。
当一个值既不是 null 也不是 undefined 时,我们将其称为“已定义的(defined), 此时,空值合并运算符户籍返回该值,否则返回最后面的值










