使用三重感叹号

aga*_*aga 51 javascript

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

if (!!!someVar) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

现在,我明白这不是某种很少使用的算子,它只是连续三次否定,就像!(!(!someVar))).我不明白它的用途是什么 - 在我看来它可以安全地用单个感叹号代替.以下是我尝试查找!!!a不等于的案例!a(直接从谷歌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
Run Code Online (Sandbox Code Playgroud)

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

Sop*_*329 81

!a和之间没有区别!!!a,因为!!!a只是!!(!a)因为!a是一个布尔值,!!(!a)它只是它的双重否定,因此是相同的.

  • 我决定在这个帖子中删除我的帖子,因为它有误导性.我要感谢**aga**和**@ jason-goemaat**在他们的评论中纠正我的错误.我在这里评论,因为上面是最直接和正确的答案.干杯! (5认同)
  • 简而言之,OP的同事从未考虑过他们在写什么。使用3x是没有用的。 (2认同)

Zoi*_*arp 23

在 JavaScript 中,它是一种表明您正在评估的不是布尔值而是真值值的方法。

因此,对于/值,您可以使用!!!!!

对于布尔值,您要么使用!,要么什么都不用。

这只是为了可读性。


Fil*_*lip 11

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


the*_*eep 5

考虑:

var x;
console.log(x == false);
console.log(!x, !x == true);
console.log(!!x, !!x == true, !!x == false);  
Run Code Online (Sandbox Code Playgroud)

...控制台输出为:

false 
true true 
false false true
Run Code Online (Sandbox Code Playgroud)

请注意,即使x在初次使用时是“ falsey”,它还是与false不同。

但是第二个用法(!x)具有实际的布尔值-但这是相反的值。

因此,第三个用法(!! x)将“ falsey”值转换为真实的布尔值。

...考虑到这一点,第三个感叹号对原始值进行了TRUE否定(对“ true boolean”值进行了否定)。

预计到达时间:

我的天啊!我不敢相信我没有注意到这是一个TRIPLE感叹号问题!即使在特别向我指出之后。

因此,尽管我的回答对某人很有用,但我必须同意其他人的意见,即三重感叹号在功能上与单个感叹号相同。

  • 很好,但是没有回答这个问题。 (2认同)
  • 哦,等等……是的;我现在明白了。对困惑感到抱歉。 (2认同)