问题带入
问题1:
console.log(true && false) //?
console.log("1" && 2) // ?
console.log("" && 2) //?
console.log(" " && 2) //?
console.log(0 && "2") // ?
console.log(a=5 && a+=5) // ?
&&(逻辑与)和||(逻辑或)这两个操作符应该是很多人都知道且运用于项目当中。最简单的理解莫过于电路当中的串联与并联。
逻辑与(&&): 当两边式子都成立的时候结果返回右边成立的那个。(两者 都为真(true)返回右边真),如果其中一个为false(假),则返回false。
上面打印出来的结果:
console.log(true && false) //false
console.log("1" && 2) // 2
console.log("" && 2) //
console.log(" " && 2) //2
console.log(0 && "2") // 0
console.log(a=5 && a+=5) // Invalid left-hand side in assignment
true&&false这不用说了;字符串”1” 为true 所以第二个打印出2;
第三和第四的字符串中有一个空格的差别,没有空格的是一个空字符串,空字符串经过valueof等过程的解析会为false,所以打印出空,而第四个中间有空格,那个空格也可以算作一个字符所以为true, 返回2;
最后一个报错,这个错误一看就应该明了,赋值错误,为什么会赋值错误呢?仔细想想,原来与操作符的优先级有关,此句等效于 console.log((a=5 && a)+=5); 此时a没有定义也没有初始化,所以会报错。只需加上小括号提高+=的优先级就好了,console.log((a=5) &&(a+=5)) //10
问题2:
console.log(true || false) //?
console.log("1" || 2) //?
console.log("" || 2) //
console.log(" " || 2) //?
console.log(0 || "2") // ?
console.log(a=5 || a+=5) // ?
不用想都知道,是与上面相反。
逻辑或(||): 当两边式子都成立的时候结果返回左边成立的那个。(两者 都为真(true)返回左边真,因为一旦左边为true就不会执行右边的运算,两者都为false时返回右边false),如果其中一个为false(假)一个为true,则返回true。只有两者都为false时才会返回false。
打印结果:
console.log(true || false) //true
console.log("1" || 2) // "1"
console.log("" || 2) // 2
console.log(" " || 2) // " "
console.log(0 || "2") // "2"
console.log(a=5 || a+=5) // 报错,同上
最后一个只需将+=的优先级提高,console.log(a=5 || (a+=5)),而前面的&&需要两边都加小括号console.log((a=5) && (a+=5)):
先转化为:
console.log(a=(5 || (a+=5)));
console.log(a=(5 && (a+=5)));
因为一般程序执行顺序是从左至有, || 如果发现左边为true 则不会再执行右边内容,而&& 如果左边为true还要执行右边内容再返回,而右边a没有初始化所以报错。
常用设置 对象为null或者undefined时候的默认值
console.log(null || 0) //0
console.log(null || '') //
console.log(undefined || 1) //1
console.log(undefined || 0) //0