【问题标题】:Why does Node.js' Assert.js use !!!value in their code? What purpose does it serve? [duplicate]为什么 Node.js 的 Assert.js 在他们的代码中使用 !!!value?它的用途是什么? [复制]
【发布时间】:2014-07-07 14:40:48
【问题描述】:
function ok(value, message) {
  if (!!!value) fail(value, true, message, '==', assert.ok);
}
assert.ok = ok;

!!!value 基本上是指not not not Boolean(value) 是吗?

如果是value = 9 > 1,则表示:not not not true

not true = false
not not true = true
not not not true = false

我的大脑很痛。他们为什么不直接使用!value 而不是!!!value

【问题讨论】:

标签: javascript node.js


【解决方案1】:

!value!!!value 确实具有相同的效果

但是,他们故意使用 !! 将潜在的“真实”或“虚假”变量 value 转换为布尔值。

因此,在将value 用作否定布尔值时使用!!! 确实有意义,因此开发人员可以看到(在这种情况下)value 可能只是“真实”,例如一个字符串,而不是true

如果在重构中有人需要将某些内容设置为 true 并使用 value,则可以将其设置为字符串。 !!! 告诉他使用 !!value,如果他期望 value 作为布尔值。

【讨论】:

  • R.E 你的第二段;使用单个! 更有意义,因为它与!!! 具有相同 效果。
  • 这完全无法解决为什么 !!!value 与 !value 不同的问题,而实际上并非如此。
  • 问题不是为什么 !!!value 不同于 !value。问题是他们为什么要这样写。
  • @Matt 是的,它具有相同的效果。但是三元组! 表明value 不一定是true
  • @juk:我不确定你的意思。单个! 也不需要 `value` 为真。
【解决方案2】:

可能的答案是他们使用它来强调转换,或者某些程序员只是在某些时候认为它很有趣——!x!!!x(或 @ 987654323@ 就此而言)。在第一个将变量转换为布尔值的! 之后,您只是重复地将not 运算符添加到某些东西。重要的是它是否被否定了偶数或奇数次。

【讨论】:

    【解决方案3】:

    这肯定会引起脑痛。

    通常,您会看到如下内容 var error_boolean = !!(error);

    这样做是为了强制“error_boolean”为真或假。

    我的猜测是这是一个重构错误,具有无害的后果。有人可能用!value 替换了notValue 之类的东西(这里是双重否定的)。注释那条源代码告诉你什么?

    或者这只是一种在生产线上吸引注意力的方式,到目前为止它对我们有效。

    【讨论】:

      【解决方案4】:

      !!是强制转换或将变量转换为布尔值和附加的!反转它。 如果更容易阅读,我认为你可以这样做 var reverseBool = !Boolean("false");

      【讨论】:

      • 不,!!,第一个 ! 转换为布尔值并将其反转,第二个将其恢复为原始真实值。
      • ! 运算符的单个应用程序足以将操作数转换为布尔值并取反。您不必显式调用Boolean()
      • @FrédéricHamidi 你是对的。 jsfiddle.net/geoyws/5S5kv/1 也许他们只是出于习惯而这样做是为了可读性。但确实!就足够了。啊程序员的生活。
      猜你喜欢
      • 2016-03-28
      • 1970-01-01
      • 2015-08-07
      • 2021-07-29
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      • 2015-06-20
      相关资源
      最近更新 更多