关于javascript:为什么使用if(!! err)?

Why use if (!!err)?

在Sequize文档的代码示例中:

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

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


Why are they using (!!err) to test that err's truthiness?

没有理由。也许他们太过谨慎了,听说了一些关于穿透力的错误消息?或者他们想强调在评估if条件时出现的ToBoolean类型?

Isn't that the same as if (err)?

对。

1
2
3
if (err)
if (Boolean(err))
if (!! err)

所有这些都意味着完全相同的事情。后两种方法在得到相同的结果之前只做了不必要的步骤。


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

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

例如,定义一个字符串

1
var vari ="something";

并检查其布尔等效值

1
console.log(!!vari);

为什么你的部分问题

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

!! intent is usually to convey to the reader that the code does not care
what value is in the variable, but what it's"truth" value is.

如Bhojendra-C-Link Nepal所示

1
2
3
4
5
6
7
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,所以如果块将在上面的代码中执行,仍然是真的。


这真的很重要。

但是,等等!当我们用它来测试对与错时,情况就完全不同了:

1
2
3
4
5
6
7
8
9
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

但真正的布尔值记录如下所示:

1
2
3
4
5
6
7
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){//string甚至可以被检查为真或假,因此if(!!err){用于确保它是假或真的。

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