【问题标题】:Why use if (!!err)?为什么要使用 if (!!err)?
【发布时间】:2015-01-31 04:40:03
【问题描述】:

在此代码示例中来自sequlize docs:

if (!!err) {
    console.log('Unable to connect to the database:', err)
} else {
    console.log('Connection has been established successfully.')
}

他们为什么要使用(!!err) 来测试这个错误的真实性?不是和if (err)一样吗?

【问题讨论】:

  • 据我所知是一样的...
  • 是的,检查真实性是一样的。我想这只是人们在条件表达式中测试一个实际的布尔值而不是让解释器为他们强制它。恕我直言,除非您想显式返回布尔值(例如 return !!err;),否则 !! 是多余的。
  • 不太一样... err 是一个对象。 !!将其转换为反转的布尔值,然后再次反转布尔值......如果它是假的(例如 0、null、未定义等),它将是假的,否则为真。所以 !!不是运算符,它只是 !运算符两次。
  • 它在if 语句中没有任何作用,任何真实的东西都会触发 if 块。
  • 这个问题不是stackoverflow.com/questions/784929/…的重复问题。该问题提供了有关 !! 语法及其作用的信息,但没有解释为什么在 OP 的问题中使用它。这是另一个问题,事实证明答案是在 OP 的代码示例中不需要该语法,因为 if (err)if (!!err) 生成相同的逻辑。

标签: javascript node.js


【解决方案1】:

这真的很重要。

但是,等等!当我们用来测试真假时,这真的是不同的事情:

err = 'This is also to be a true if you convert it to boolean';
if(!!err == 1){
  console.log('test by converting to boolean');
}
if(err == 1){
  console.log('a real boolean test');
}

//outputs only: test by converting to boolean

但一个真正的布尔值记录两者,如下例所示:

err = true;
if(!!err == 1){
  console.log('test by converting to boolean');
}
if(err == 1){
  console.log('a real boolean test');
}

所以双感叹号仅用于转换为布尔值。

因此,人们使用条件来确保该值是否为布尔值,如果不是,则对其进行转换并检查它,但如果他想严格检查是否为真,那么他将使用1 === 1 进行比较在上面的例子中,应用了完全相同的东西。

但是就像在您的代码中一样,if(!!err){ 用于确保它是 false 或 true,因为缺乏对 if(err){//string 甚至可以检查为 true 或 false 的深入了解。

就是这样。由!!进行准确检查。

【讨论】:

  • 是的,这就是我的观点,很好的例子@Bhojendra (Y),我希望你也可以将这个东西添加到我的答案中
  • 您正在分享有关!! 的信息,但没有回答为什么在if (!!err) 的上下文中使用它的问题。这不是问题的答案。人们需要注意提出的问题。这里有很多关于!! 的信息:stackoverflow.com/questions/784929/…
  • 实际上他已经提供了真正的理由wbout“为什么”部分你的答案和我一样,你可以仔细看看这个例子。你会知道他想说什么
  • @A.B 请随时结合我的答案。
  • == 1 与问题有什么关系?为什么还要将 boolean 值与数字 1 进行比较?
【解决方案2】:

双感叹号将任何事物转换为该表达式的布尔表示,无论它在布尔值意义上是真还是假

它将非布尔值转换为反转布尔值

例如定义一个字符串

var vari = "something";

并检查其布尔等效项

console.log(!!vari);

为什么你的一部分问题

作者或作者可能过早地检查错误是否存在。或者有一个额外的检查,有些人没有传递一个表达式,而不是需要检查为布尔值的错误。在这两种方式中它都在做同样的事情所以我解释了这意味着你不需要担心为什么现在因为它们是相同的 作者的意图可以是

!!意图通常是向读者传达代码并不关心 变量中的值是什么,但它的“真实”值是什么。

作为 Bhojendra - C-Link 尼泊尔的例子

err = 'This is also to be a true if you convert it to boolean';
if(!!err == 1){
  console.log('test by converting to boolean');
}
if(err == 1){
  console.log('a real boolean test');
}

one 被认为是 true 但 'this sentence' 不等于 1 ,因此在上面的代码中将执行 if 块仍然为 true

【讨论】:

  • 我认为这不能回答问题,因为if (err) 不会生成与if (!!err) 相同的分支吗?所以,我们仍然想知道“为什么要使用 if (!!err)?”
  • @jfriend00 没有。这也可能是一个错误的条件。但是 if(err) 是一个真实的条件
  • @Bhojendra-C-LinkNepal - 对于err 的什么值,if (err) 生成的结果与if (!!err) 不同。只有这样才能回答问题。
  • 我同意。在 if 语句的上下文中,if (null) 仍然是虚假的,这似乎没有必要。
  • 正如Bergi 的回答所示,这个答案不是问题的答案。这是关于!! 的信息,但不是问题的答案。
【解决方案3】:

他们为什么要使用(!!err) 来测试这个错误的真实性?

没有理由。也许他们过于谨慎,听说过一些关于真实性的错误信息?或者他们想强调在评估if 条件时出现的ToBoolean cast

这不是和if (err)一样吗?

是的。

if (err)
if (Boolean(err))
if (!! err)

所有的意思都是一样的。后两者只是在达到相同结果之前在两者之间执行不必要的步骤。

【讨论】:

    猜你喜欢
    • 2018-11-26
    • 1970-01-01
    • 2012-07-06
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多