什么!!〜做什么?

时间:2012-11-28 11:09:41

标签: javascript

我正在阅读提到的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

3 个答案:

答案 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,结果如下:

enter image description here

更新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