三重感叹号的使用
Posted
技术标签:
【中文标题】三重感叹号的使用【英文标题】:The use of the triple exclamation mark 【发布时间】:2014-02-04 22:20:09 【问题描述】:查看我们的一个项目的源代码,我发现我们在条件语句中使用了三个感叹号的一些地方,如下所示:
if (!!!someVar)
// ...
现在,我知道这不是某种很少使用的运算符,它只是连续三个否定,例如!(!(!someVar)))
。我不明白它有什么用 - 在我看来,它可以安全地替换为单个感叹号。以下是我尝试找到!!!a
不等于!a
的情况(直接取自谷歌浏览器控制台):
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
我是否遗漏了一些罕见(或明显)的案例?
【问题讨论】:
根据here 给出的答案,!!
似乎是“转换为布尔值”的简写方式,因此!!!
转换为否定的布尔值。像你一样,我想不出一个单一的!
不会做得那么好......
我会说它可能只是通过手动删除括号来“简化”到该表达式中。
也许有人认为三个感叹号比一个感叹号更明显?
不。 !a
已经是一个布尔值,所以!a
、!!!a
、!!!!!a
等都是相同的。
人们会说它是为了可读性,但实际上它并不更具可读性。对于为什么要使用 3 个感叹号,这确实不是一个有意义的论点。如果 3 个感叹号比 1 更易读,那么 5 应该比 3 更易读吗?为什么不使用 10001 个感叹号来获得最大的可读性?
【参考方案1】:
在 javascript 中,这是一种表明您正在评估的不是 boolean 而是 truthy 或 falsy 值的方式。 p>
因此,对于 truthy/falsy 值,您可以使用 !!
或 !!!
。
对于 boolean 值,您可以使用 !
或不使用任何内容。
这只是为了便于阅读。
【讨论】:
【参考方案2】:考虑:
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 在第一次使用时是“假”,但它与假不同。
但是 second 使用 (!x) 有一个实际的布尔值 - 但它是相反的值。
因此,第三次使用 (!!x) 将“假”值转换为真正的布尔值。
...考虑到这一点,第三个感叹号对原始值进行 TRUE 否定(对“真正的布尔值”值的否定)。
预计到达时间:
天哪!我不敢相信我没有注意到这是一个三重感叹号问题!甚至在有人特别向我指出之后。
因此,虽然我的回答希望对某人有用,但我必须同意其他人的观点,即三感叹号在功能上与单感叹号相同。
【讨论】:
没关系,但它不能回答问题。 我应该说一个简单的“是”或“否”?第一行暗示了“我错过了什么”这个问题的答案; “x 是‘假’,但与假不同”。 问题是关于三个感叹号,你的回答根本没有提到。虽然可以由熟悉 JavaScript 的人从您的回答中确定答案,但如果发帖者知识渊博,他们一开始就不必问这个问题。 嗯...我想我应该包含控制台输出。我添加了这一点以帮助使事情更清楚。恐怕我不明白我为什么不解决三个感叹号。 哦,等等……是的;我现在明白了。很抱歉造成混乱。【参考方案3】:和一个感叹号一样。它背后的关键思想是提高程序员的可见性。编译器会将其优化为单个“!”无论如何。
【讨论】:
对动机的有趣解释。在 C++ 中,我发现最好用 not 解决可读性问题(从一开始它就是语言标准的一部分,但人们不练习它......你不能打电话一个变量,那为什么不使用它呢?) 再说一次,我也使用 and / or 而不是 && / || 在“绝对是 C++ 而不是 C 代码”中。所以我很奇怪。 这个答案非常适合 JavaScript,尤其是在 w3schools.com/xml/xml_cdata.asp 中使用时 你是说解释器吗? JS没有编译器吧?也许在他们只使用 GoogleV8 引擎的 nodejs 上?【参考方案4】:!a
和 !!!a
之间没有区别,因为 !!!a
只是 !!(!a)
并且因为 !a
是布尔值,!!(!a)
只是它的双重否定,因此相同。
【讨论】:
我决定删除我在这个线程中的帖子,因为它具有误导性。我要感谢 aga 和 @jason-goemaat 纠正我在他们的 cmets 中的错误。我在这里发表评论,因为上面是最直接和正确的答案。干杯! 如果 a 为空?你只想要错误的价值。 !a 返回 true 和 !!!a false ? @Dujard!!!null
是真的。一个感叹号永远等于三个感叹号。
@Dujard !!!null
是真的。一个感叹号永远等于三个感叹号。
简而言之,OP 的同事从未考虑过他们在写什么。使用 3x 是没用的。以上是关于三重感叹号的使用的主要内容,如果未能解决你的问题,请参考以下文章