【问题标题】:Why "if(!!variable)" instead of "if(variable)"? [duplicate]为什么是“if(!!variable)”而不是“if(variable)”? [复制]
【发布时间】:2016-11-02 07:06:25
【问题描述】:

在别人的代码中我发现了这种方法来测试变量的存在:

if(!!variable) {
  //Do something
} else {
  //Something else
}

是否有理由使用 if(!!variable) 而不是 if(variable) 进行测试?这是一个好习惯吗?

【问题讨论】:

  • 为什么,真的?对我来说似乎不太可读。迫不及待想看看别人怎么说。
  • 我能想到的唯一使用!!是将某些东西转换为bool。例如。 var i = !!0; console.log(i); //false (instead of 0).
  • 我认为在这种特殊情况下它没有任何区别。但是当您想将任意值转换为布尔值时(稍后将其保存到数据库等)时,它很有用
  • if 始终转换为布尔值。
  • 有些人将其用作显式强制而不是布尔值。有些人发现明确告诉他们想要评估布尔值更具可读性。

标签: javascript


【解决方案1】:

是否有理由使用if(!!variable) 而不是if(variable) 进行测试?

没有。

无论如何,使用if() 会将条件强制转换为布尔值,无需手动执行。当你想保证你在别处有一个布尔值时,使用这种语法是有意义的,例如,如果你想记录表达式的真实性:

console.log(!!variable)

这将确保您记录到 truefalse,而不是变量的原始值。但是在if 里面?没有区别。

【讨论】:

  • 它与其他逻辑操作一起也很有用:例如,0 && true 产生 0。如果您期望一个布尔值,请尝试:!!0 && true
  • @LUH3417 确实如此。但是这两者在 if() 中的行为方式相同,这就是问题所在。
【解决方案2】:

不,在 if 的情况下,他们通常没有理由在 JS 中编写。

我不会称其为不好的做法,因为它通常来自来自强类型语言的程序员,并且是在那些语言中转换为 bool 的常用快速方法。

也可以用来强调长if中值的真实性的重要性,表明程序员没有忘记放条件。

TL:DR:至于很多事情:这可能不是好的做法,但只有当您的团队不习惯这种做法时,它才会成为不好的做法,要么培训他们,要么记录下来,要么离开它。

【讨论】:

    【解决方案3】:

    双重否定是一种将变量转换为布尔值的方式(恕我直言)。在变量上使用! 将其强制转换为布尔值并将其取反,然后再次使用它将其转换回“正确”值。所以!!0 === false

    正如 James 所说,没有理由在 if 语句中这样做。真正这样做的唯一原因是为了日志记录或类似目的强制使用布尔值,因此记录的值是truefalse 而不是0,一个空字符串等

    【讨论】:

    • if(0)if(!!0)有什么区别
    • @SergioTulentsev 实际上没有区别,因为if 无论如何都会强制该值。
    • 这是我试图暗示你的回答没有回答实际问题。
    • @SergioTulentsev 够公平的。我误解了这个问题,但试图扩大一点(为了它的价值)
    • 我看到了,我撤回了我的反对票。 :)
    【解决方案4】:

    Double ! (!!) 不是运算符。只是 !两次 - 双重否定

    【讨论】:

    • 但是为什么要专门在这里使用呢?它不像被分配给一个你想保证是布尔值的变量。
    • 这如何回答这个问题? JFYI,问题不是“这个!! 运算符是什么,它有什么作用?”。
    猜你喜欢
    • 2011-03-02
    • 2020-11-07
    • 2013-03-28
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    相关资源
    最近更新 更多