先讲讲 逻辑与 &&:
先清楚一点: && 返回的不一定是boolean 类型。
个人总结的经验是:不需要去记忆太多的规则,&& 简单理解就是“找假的”,从左至右,依次隐式转换为boolean类型后判断是否为false,
是的话就返回该值(返回的是原类型)。如果到最后一个值隐式转换后还是true,则返回最后一个值(返回的也是原类型)。
关于隐式转换,0、‘’、null、false、undefined、NaN 转换后为 false。
例如:
var a = 1;
var b = 'abc';
var c = a/b;
var d;
console.log(false && 1); //false
console.log(null && d); //null
console.log(d && null); //undefined
console.log(1 && null && d); //null
console.log(1 && d && null); //undefined
console.log(1 && null && c); //null
console.log(1 && c && null); //NaN
console.log(c && d && null); //NaN
console.log(0 && c && d && null); //0
console.log(1 && false && 2); //false
console.log(1 && 0 && false && 2); //0
console.log(1 && "s" && 3); //3
再讲讲 逻辑或||:
|| 简单理解就是“找真的”,从左至右,依次隐式转换为boolean类型后判断是否为true,
是的话就返回该值(返回的是原类型)。如果到最后一个值隐式转换后还是false,则返回最后一个值(返回的也是原类型)。
例如:console.log("" || null); //null
console.log(0 || "" || NaN); //NaN
console.log(0 || undefined); //undefined
console.log(0 || undefined || 0); //0
console.log(0 || 1 || undefined ); //1
逻辑非 !:
返回的是隐式转换后的boolean类型的值。
例如:!2 //false
!! :
第一个! 表示逻辑非,第二个! 再取反。(相当于隐式转换后的结果)。
例如:!!2 //true