"===!" 运算符是做什么用的?

5

我正在尝试运用JavaScript,并发现了一些奇怪的现象。

这段代码会弹出一个"false"的警告,但不会报错。有人能解释为什么在 === 后面添加一个或多个 !!! 没有导致任何错误吗?

var i = void 0;
var b = i ===! void 0  ? "true" : "false";
alert(b);//display false but no syntax errors..

1
!表示否定下一个语句,即使下一个语句是! - RienNeVaPlu͢s
1
为什么要这样做呢?!只是一个否定,所以多个!只会互相反转。 - Alma Do
3个回答

11

空格意味着什么都没有,所以它是

var b = (i === (!void 0))  ? "true" : "false";

它是什么

var b = (i === true) ? "true" : "false";

MDN 运算符优先级


好的,我明白了。谢谢你的回答和链接。 - Merlin
为了清晰起见,我可能还会包括 i === true; // false(或许加上括号)。 - Paul S.

5

!是一个否定运算符,并且它是右结合的,与大多数其他运算符不同,所以它将只否定它前面的任何内容。

这基本上相当于

var b = i ===(!void 0) ? "true" : "false";

因此,基本上,您可以在某些东西前面有任意多个 ! ,而这不会有任何影响,所以!!!!!!!!!!!!!false将评估为true,因为这与!(!(!(!(!(!(!(!(!(!(!(!false))))))))))))是相同的。


@user2864740 哈哈,糟糕了,我是在一个之前定义了 i 的页面上测试的。 - scrblnrd3
3
我会假设你已经正确地输入了 !(...) 的数量并点赞 :) - Adam Rackis
3
@AdamRackis 我费尽心思地加入了正确数量的括号。 - scrblnrd3
@scrblnrd3,你得非常努力去数它们 :) - Merlin

2
请看下面的表格,它可能有助于解释:
!0 // true
!!0 // false
!!!!!!0 // false, showing that !s are simply prefixes
! 0 // true, showing whitespace is irrelevant
0 === !0 // false
0 ===! 0 // false
0 ===!!! 0 // false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接