在 JavaScript 中使用 (!!!) 运算符? [复制]

Posted

技术标签:

【中文标题】在 JavaScript 中使用 (!!!) 运算符? [复制]【英文标题】:Using the (!!!) operator in JavaScript? [duplicate] 【发布时间】:2013-11-23 11:33:53 【问题描述】:

!!运算符显然很有用,因为它强制检查不是布尔值的东西作为布尔值 - 那是“真”条件。

但是假的呢?需要用!!!?

【问题讨论】:

!将一个值转换为逆布尔值(如果它是真的,它变成假,假的它变成真的) !val === !!!val 用于任何 val 值 @Simon:我从未见过====。假设您的意思是严格比较,那么布尔运算如何与比较相反? 这个问题不是不是开玩笑吗? @GuilhermeSehn 您应该澄清 !value 足以进行布尔转换。 【参考方案1】:

一个! 就足够了:)

!1 // false
!0 // true

【讨论】:

不,如果某些东西返回为未定义,则不会。 !!强制将 undefined 转换为 true。 @antonpug:你确定吗? jsfiddle.net/kkf7Y 单个 ! 似乎工作得很好,至少在我的浏览器中是这样。 ***.com/questions/4686583/… @antonpug 好的,您发布的链接仅表明我是对的。 !!永远不会在未定义时返回 true。单身的 !将任何值转换为布尔值并对其应用 NOT 操作,第二个!只会再应用一个 NOT。【参考方案2】:

!! 本身不是运算符;它只是使用 javascript 的逻辑 NOT (!) 运算符的一种方式。

要将x 转换为布尔值,!!x 有效,因为当您将布尔值取反两次时,您会得到原始布尔值,而!x 在取反之前将x 转换为布尔值。

同样,!!!xx 转换为布尔值并取反三次,相当于只取反一次。所以你可以使用!x 而不是!!!x

【讨论】:

这个答案很完美,很清楚。【参考方案3】:

这是“真”条件。

不,它适用于任何价值。 !! 会将任何值转换为等效的布尔值。

为什么?因为 not 运算符只是返回相反的布尔值。所以

0    // is falsy
!0   // -> true
!!0  // -> false

'foo'    // is truthy
!'foo'   // -> false
!!'foo'  // -> true

任何其他应用程序只会再次切换该值。因此!!! 等价于!!!!! 等价于!! 等等。

【讨论】:

【参考方案4】:
var boolCheck = 0;
   boolCheck //0
  !boolCheck //true
 !!boolCheck //false
!!!boolCheck //true - again

同样的事情:

var boolCheck = 1;
   boolCheck //1
  !boolCheck //false
 !!boolCheck //true
!!!boolCheck //false - again

没有理由使用这个(!!!),这是一个重言式。 !! 在以下情况下很有用:

    我们需要一个布尔值,当有一些结果时(!!5 => true); 我们需要将 false 缩短为 !1true - !0
      或跳过包装器。

【讨论】:

【参考方案5】:

这完美回答了你的问题https://***.com/a/264037/1561922

!!!x 可能正在反转布尔转换 !!x:

var myBool = Boolean("false");  // == true

var myBool = !!"false";  // == true

“任何不为空的字符串都将评估为真”

所以!!!"false"; // == false

这个问题不是开玩笑。 Node.js (downloaded 5 days ago) uses this in Assert.js 例如:

function ok(value, message) 
  if (!!!value) fail(value, true, message, '==', assert.ok);

assert.ok = ok;

编辑:我认为他们这样做是出于习惯的代码可读性原因,因为!value already suffices。

编辑:Node changed it. 我不知道为什么我 5 天前下载的 Node.js 版本仍然使用 !!!value 而不是 GitHub 中的 !value。

编辑:This is the reason why.

【讨论】:

以上是关于在 JavaScript 中使用 (!!!) 运算符? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 Javascript 中使用多个 = 运算符有啥作用? [复制]

在 JavaScript 比较中应该使用哪个等号运算符(== vs ===)?

在 JavaScript 比较中应该使用哪个等号运算符(== vs ===)?

在 JavaScript 比较中应该使用哪个等号运算符(== vs ===)?

在 JavaScript 比较中应该使用哪个等号运算符(== vs ===)?

在 JavaScript 中使用 (!!!) 运算符? [复制]