通过查看我们其中一个项目的源代码,我发现了一些我们在条件语句中使用三个惊叹号的地方,如下所示:
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)它只是它的双重否定,因此是相同的.
Zoi*_*arp 23
在 JavaScript 中,它是一种表明您正在评估的不是布尔值而是真值或假值的方法。
因此,对于真/假值,您可以使用!!或!!!。
对于布尔值,您要么使用!,要么什么都不用。
这只是为了可读性。
考虑:
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感叹号问题!即使在特别向我指出之后。
因此,尽管我的回答对某人很有用,但我必须同意其他人的意见,即三重感叹号在功能上与单个感叹号相同。