【问题标题】: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 个感叹号来获得最大的可读性?

标签: javascript


【解决方案1】:

在 JavaScript 中,这是一种表明您正在评估的不是 boolean 而是 truthyfalsy 值的方式。 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 是没用的。
    猜你喜欢
    • 2020-07-25
    • 2013-08-13
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 2017-01-05
    • 2018-03-18
    • 1970-01-01
    相关资源
    最近更新 更多