假值前的感叹号在if条件中为何等价于==false而非==true?
关于JavaScript中逻辑非(!)的疑问
先看这段代码:
let isGameOver = false; if(!isGameOver){ console.log('game goes on.') } if(isGameOver){ console.log('game over') }
你疑惑的点是:这段代码里的感叹号!看起来没取反isGameOver的返回值,觉得它等价于if(isGameOver == false){...},不解为什么它没有把isGameOver转为真值,变成等价于if(isGameOver == true)的判断。
逻辑非!的核心作用就是对布尔值取反,你的理解刚好搞反了逻辑:
- 当
isGameOver的值是false时,!isGameOver会把它取反成true,所以第一个if条件成立,执行对应的代码——这和if(isGameOver == false)的逻辑完全一致,因为isGameOver == false的运算结果就是true,条件自然成立。 - 如果想要判断逻辑等价于
if(isGameOver == true),要么直接写if(isGameOver)(因为当isGameOver为true时,条件本身就成立),要么写!!isGameOver(两次取反,把原布尔值转回本身)。
举个直观的测试例子:
let flag = false; console.log(!flag); // 输出 true(一次取反,把false转为true) console.log(!!flag); // 输出 false(两次取反,回到原布尔值) console.log(flag == false); // 输出 true console.log(flag == true); // 输出 false
内容的提问来源于stack exchange,提问作者MarlonB
相关产品推荐
相关产品推荐

