我刚刚在一个 Windows 应用商店应用示例中遇到了以下代码行。
if (that.assets[asset].object === null || !!!that.assets[asset].object.canPlayType) {
它使用三重感叹号语法。我已经做了一些测试(我很确定我错过了一些东西),结果总是一样的!
。我认为它有点等价于===
and !==
...
谁能解释一下!!!
语法是什么意思?
我刚刚在一个 Windows 应用商店应用示例中遇到了以下代码行。
if (that.assets[asset].object === null || !!!that.assets[asset].object.canPlayType) {
它使用三重感叹号语法。我已经做了一些测试(我很确定我错过了一些东西),结果总是一样的!
。我认为它有点等价于===
and !==
...
谁能解释一下!!!
语法是什么意思?
我认为它有点等价于 === 和 !==...
不,它只是三个“非”运算符,一个“非非非”。
它与 , 相同!(!(!(x)))
,并且始终等同于单个!x
.
这实际上是没有用的。!!
是将任何变量转换为其布尔表示的一种有点神秘的方法,但这!!!
只是愚蠢的。您可以将任意数量的!
' 链接在一起,但这对任何事情都没有用。
!!!是一个三重否定,所以它与 ! 相同:
!true -> false
!!true -> true
!!!true -> false
这完美地回答了你的问题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 修正。