使用三重感叹号

时间:2014-01-16 06:10:33

标签: javascript

查看我们其中一个项目的源代码,我发现了一些我们在条件语句中使用三个感叹号的地方,如下所示:

if (!!!someVar) {
    // ...
}

现在,我知道这不是某种很少使用的运算符,它只是连续三次否定,如!(!(!someVar)))。我不明白它的用途是什么 - 在我看来它可以安全地用单个感叹号代替。以下是我在!!!a不等于!a时尝试查找案例(直接来自Google Chrome控制台):

var a = ''
""
!!!a === !a
true
a = 'string'
"string"
!!!a === !a
true
a = null
null
!!!a === !a
true
a = 12
12
!!!a === !a
true
a = {b: 1}
Object {b: 1}
!!!a.c === !a.c // a.c is undefined here
true
a = []
[]
!!!a === !a
true
a = [1,2]
[1, 2]
!!!a === !a
true

我错过了一些罕见(或明显)的案例吗?

6 个答案:

答案 0 :(得分:68)

!a!!!a之间没有区别,因为!!!a只是!!(!a)而且!a是布尔值,!!(!a)是只是它的双重否定,因此也一样。

答案 1 :(得分:8)

它与一个感叹号相同。其背后的关键思想是提高程序员的可见性。编译器会将其优化为单个'!'反正。

答案 2 :(得分:4)

考虑:

var x;
console.log(x == false);
console.log(!x, !x == true);
console.log(!!x, !!x == true, !!x == false);  

...控制台输出是:

false 
true true 
false false true

请注意,即使x在第一次使用中是“假”,也与false不同。

第二个使用(!x)有一个实际的布尔值 - 但它是相反的值。

所以第三个​​使用(!! x)将“falsey”值变成一个真正的布尔值。

...考虑到这一点,第三个​​感叹号对原始值进行了 TRUE 否定(否定了“真正的布尔值”)。 / p>

ETA:

OMG!我无法相信我没有注意到这是一个三重感叹号问题!甚至在特别指出我之后。

所以,虽然我的回答对某些人有用,但我必须同意其他人发布过三重感叹号在功能上与单一感谢相同的内容。

答案 3 :(得分:0)

在javascript中,这是一种显示您正在评估的内容不是 boolean 而是 truthy falshy 的方式。

因此对于 truthy / falshy 值,您可以使用!!!!!,对于 booleans {{1 }} 或者什么都没有。

这仅仅是为了提高可读性。

答案 4 :(得分:-1)

第一个双感叹号变为布尔值,对象的任何虚假值(undefined,null,0)或任何truthy值,然后第三个否定它。

答案 5 :(得分:-2)

此外,当您在控制台中使用它时,它就像exit