【问题标题】:Difference in if statement negationif 语句否定的区别
【发布时间】:2021-10-12 17:03:35
【问题描述】:

我正在为自己编写一些代码只是为了更好地学习 JS,我想知道 if 语句与比较两个值的运算符或否定整个条件的运算符的否定条件是否有任何区别。

第一个是这样的:

if(value != 'foo') {}

第二个:

if(!value == 'foo') {}

有没有更好、更合适的?

谢谢!

【问题讨论】:

  • 它们在语义上是不同的。第二个总是false,因为!value 总是一个布尔值,因此不等于foo。你可能打算写if (!(value == 'foo')
  • if(value != 'foo') {}if(!(value == 'foo')) {} 相同。在 99% 的情况下,第一个更具可读性和首选。您的第二个示例没有任何意义,因为在大多数情况下 value 将是 true。

标签: javascript if-statement


【解决方案1】:

第一个,

if(value != 'foo') {}

不仅更具可读性,而且是唯一能按照您的预期工作的方法。

这意味着“值不等于'foo'”。

你的第二个,

if(!value == 'foo') {}

表示“值的倒置真实性是否等于'foo'”

(它将value 转换为布尔值,并取其否定版本)

但是,如果你想说

if (!(value == 'foo'))

对于您的第二个,答案仍然相同,哪个更好:第一个。

!= 已经存在时,没有理由扩展声明,使其更加混乱。


看看这个演示:

const value1 = "foo";
const value2 = "bar";

console.log("expected", false, true);
console.log("first option", value1 != 'foo', value2 != 'foo');
console.log("second option", !value1 == 'foo', !value2 == 'foo');
console.log("modifed second option", !(value1 == 'foo'), !(value2 == 'foo'));
test "foo" "bar"
expected false true
first option false true
second option false false
modifed second option false true

如您所见,您给定的第二个选项将始终导致false,因为它正在测试true(如果值为空字符串)或false(如果值为非空字符串)是否等于字符串文字foo

【讨论】:

    【解决方案2】:

    对这种差异的基本解释是,当您执行 value != 'foo' 时,您正在检查 value 是否不等于 'foo',但是当您执行 !value == 'foo' 时,您将 value 评估为 ' true' 或 'false',然后检查该布尔值是否等于 'foo'。

    例如

    let value = 'foo'
    
    value == 'foo' //evaluates to true
    value != 'foo' //evaluates to false
    !value //evaluates to false
    !value == 'foo' //also evaluates to false
    

    这是另一篇讨论这些运算符的帖子https://stackoverflow.com/a/8616501/16600680

    【讨论】:

      猜你喜欢
      • 2012-09-17
      • 1970-01-01
      • 2023-02-06
      • 1970-01-01
      • 2013-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多