为什么使用if(!! err)?

时间:2014-12-02 19:55:04

标签: javascript node.js

来自sequlize docs的代码示例:

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

为什么他们使用(!!err)来测试这个错误的真实性?与if (err)相同吗?

3 个答案:

答案 0 :(得分:11)

  

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

没有理由。也许他们听到了一些关于无辜的错误的事情,他们会过于谨慎吗?或者他们想强调评估if条件时出现的ToBoolean cast

  

if (err)相同吗?

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

所有意味着完全相同的事情。后两者在达到相同结果之前只做了不必要的步骤。

答案 1 :(得分:2)

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

OR

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

例如定义一个字符串

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');
}

一个被认为是真的但是这个句子'不等于1,所以如果块将在上面的代码中执行,那么仍然是一个

答案 2 :(得分: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 === 1一样,用于确保它是假的或真实的,因为缺乏深度的知识if(!!err){甚至可以被检查为真或假。

就是这样。精确检查由if(err){//string完成。