~
是按位非运算符。它反转其操作数的位。!
是逻辑非运算符。按位非运算符将0
在应用于 时返回-1
,这是indexOf
在数组中找不到值时返回的内容。由于0
计算结果为false
,双重否定它只会返回false
(一个布尔值,而不是一个数字):
var index = _sessions.indexOf("_SID_5");
console.log(~index); // 0
console.log(!~index); // true
console.log(!!~index); //false
对于由 . 返回的任何其他可能值,按位非运算符将返回小于 0 的值indexOf
。由于任何其他值都将评估为true
,因此它只是一种检查元素是否存在于数组中的速记方法(有点......它们都是相同数量的字符!),而不是显式地与 进行比较-1
:
if (_sessions.indexOf("_SID_5") > -1) {
// This would work the same way
}
更新
关于它的性能,它似乎(至少在 Chrome 中)比更常见的比较-1
(它本身比与比较慢一点0
)略慢。
这是一个测试用例,结果如下:
更新 2
实际上,您问题中的代码可以缩短,这可能是作者试图做的。您可以简单地删除!!
,因为~
将始终导致0
或低于(并且0
是唯一将评估为 的值false
):
if (~_sessions.indexOf("_SID_5")) {
// This works too
}
但是,在稍微不同的情况下,添加运算符可能是有意义的!
。如果要将按位运算符的结果存储在变量中,它将是一个数值。通过应用逻辑非运算符,您可以获得一个布尔值(再次应用它可以确保您获得正确的布尔值)。-1
如果由于某种原因您需要一个布尔值而不是数字值,那么它会更有意义(但您仍然可以使用or进行正常比较0
):
var inArray = !!~_sessions.indexOf("_SID_5");
console.log(typeof inArray); // boolean