我正在阅读提到的this blog post:
!!~
我不知道这是做什么的?起初我以为它会出错,但下面的代码确实运行:
var _sessions = [
"_SID_1",
"_SID_2",
"_SID_3",
"_SID_4"
];
if(!!~_sessions.indexOf("_SID_5")) {
console.log('found');
} else {
console.log('!found');
}
输出:
node test.js
!found
答案 0 :(得分:28)
~
是按位非运算符。它反转其操作数的位。 !
是逻辑非运算符。当应用于0
时,按位非运算符将返回-1
,这是indexOf
在数组中找不到值时返回的内容。由于0
评估为false
,因此加倍否定它只会返回false
(布尔值,而不是数字值):
var index = _sessions.indexOf("_SID_5");
console.log(~index); // 0
console.log(!~index); // true
console.log(!!~index); //false
对于indexOf
返回的任何其他可能值,按位运算符将返回小于0的值。由于任何其他值都将计算为true
,因此它只是一种简短的方法(它们是......它们是相同数量的字符!),用于检查元素是否存在于数组中,而不是显式地与{进行比较{1}}:
-1
<强>更新强>
关于这一点的表现,它(至少在Chrome中)显得比与if (_sessions.indexOf("_SID_5") > -1) {
// This would work the same way
}
的更常见的比较稍慢(它本身比与-1
的比较慢一点)
这是一个test case,结果如下:
更新2
事实上,您的问题中的代码可以缩短,这可能是作者试图做的。您只需删除0
,因为!!
始终会生成~
或更低(0
是唯一会评估为0
的值) :
false
但是,在稍微不同的情况下,添加if (~_sessions.indexOf("_SID_5")) {
// This works too
}
运算符是有意义的。如果要将变量运算符的结果存储在变量中,则它将是一个数值。通过应用逻辑非运算符,您将获得一个布尔值(并再次应用它可确保您获得正确的布尔值)。如果由于某种原因你需要一个布尔值而不是数字布尔值,它会更有意义(但你仍然可以使用与!
或-1
的正常比较):
0
答案 1 :(得分:7)
为了便于阅读:请使用
.indexOf !== -1
答案 2 :(得分:5)
这很好地解释了:
The tilde operator in Javascript
将两个NOT运算符混合在一起可以产生一些有趣的结果:
!〜( - 2)= false
!〜( - 1)= true
!〜(0)= false
!〜(1)= false
!〜(2)= false
所以这只是检查值是否等于-1,如果找不到匹配则indexOf返回-1