2

我刚刚在一个 Windows 应用商店应用示例中遇到了以下代码行。

if (that.assets[asset].object === null || !!!that.assets[asset].object.canPlayType) {

它使用三重感叹号语法。我已经做了一些测试(我很确定我错过了一些东西),结果总是一样的!。我认为它有点等价于===and !==...

谁能解释一下!!!语法是什么意思?

4

3 回答 3

5

我认为它有点等价于 === 和 !==...

不,它只是三个“非”运​​算符,一个“非非非”。

它与 , 相同!(!(!(x))),并且始终等同于单个!x.

这实际上是没有用的。!!是将任何变量转换为其布尔表示的一种有点神秘的方法,但这!!!只是愚蠢的。您可以将任意数量的!' 链接在一起,但这对任何事情都没有用。

于 2013-10-23T19:07:25.450 回答
0

!!!是一个三重否定,所以它与 ! 相同:

!true -> false

!!true -> true

!!!true -> false
于 2013-10-23T19:08:28.763 回答
-1

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

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

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

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

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

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

这个问题不是开玩笑。Node.js(5 天前下载)在 Assert.js中使用了这个,例如:

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

编辑:我认为他们这样做是出于习惯的代码可读性原因,因为!value 已经足够了

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

编辑:乔纳森在这里解释了原因。Nodejs.org 的稳定版,v0.10.xx仍然有 !!!value,不稳定版本v0.11.xx有 !value 修正。

于 2014-05-19T15:23:30.493 回答