前言
最近在笔试时,遇上了这样一道题,当时没多想,以为直接就是输出true/false了,实质上最后的输出结果是2。后面才发现这里面除了涉及到逻辑与(&&)和逻辑或(||)的优先级问题,还有就是它们在输出时的特性不同。
逻辑与(&&)
逻辑或一般来说只有在前后都为true的情况下才能够返回true,否则返回false,这也是我们在日常使用最多的if条件判断中就能得到的答案。但是,从深层次来说,将其抽离出来就会发现它的输出并不是简单的true/false,试看以下代码:
console.log(true && 2) //2
我们可以发现虽然两边都是true,理论上来说应该是输出true,但是最终输出的值则为&&后面的值。我们再来看看下列代码
console.log(0 && 2) //0
console.log(0 && null) //0
console.log(null && 2) //null
可以发现0和null在类型转换中都将会转化为false值,而后面的2将会是true值,但是返回的结果不管后面的值是true/false,直接输出了&&左边的值。 此时再看看左值为true,右值,为true/false时的情况
console.log(true && 2) //2
console.log(2 && null) //null
console.log(2 && true) //true
从上述代码块可以看出,在&&之中,存在以下特性:
当左边的值经过类型转换的对应布尔值为false时,不管右值到底是什么,它都将会输出左值。
当左边的值经过类型转换的对应布尔值为true时,不管右值是什么,都将会输出右值。
逻辑或(||)
在这里直接进行代码测试
console.log(true || 2) // true
console.log(false || 0) // 0
console.log(0 || null) // null
console.log(2 || true) //2
从上可知:对于||来说:
当左边的值为true时,那么不管右边是什么,直接输出左值。
当左边为false时,不管右边是什么,都将会是输出右值。
总结:
总的来说,对于逻辑与和逻辑或来说,如果不将其用在条件判断语句中将不会发生隐式转换,所得的最终结果为上述规则,如果用于条件判断语句之中,那么将会转为true或者是false
回到本题,首先根据运算符优先级,&&比||高一级,所以将会先得 true && 2 的值为2,第一个||左边为false,第二个||右边为false,所以最终结果为2