!!〜(不是不用颚化/砰砰砰砰声)改变'contains / included'数组方法调用的结果吗?

如果你在这里阅读jQuery inArray页面的注释,那么有一个有趣的声明:

 !!~jQuery.inArray(elm, arr) 

现在,我相信一个双重感叹号将结果转换为typesboolean ,值为true 。 我不明白什么是在所有这些使用波浪号( ~ )运算符?

 var arr = ["one", "two", "three"]; if (jQuery.inArray("one", arr) > -1) { alert("Found"); } 

重构if语句:

 if (!!~jQuery.inArray("one", arr)) { alert("Found"); } 

分解:

 jQuery.inArray("one", arr) // 0 ~jQuery.inArray("one", arr) // -1 (why?) !~jQuery.inArray("one", arr) // false !!~jQuery.inArray("one", arr) // true 

我也注意到,如果我把前面的波浪号放在前面,结果是-2

 ~!!~jQuery.inArray("one", arr) // -2 

我不明白这里代字的目的。 有人可以解释它或指向我的资源?

tilde运算符实际上并不是jQuery的一部分 – 它本身就是一个按位运算符。

看到了倾斜的大奥秘(〜)

你在实验中得到了奇怪的数字,因为你正在对一个整数执行按位逻辑操作(对于我所知道的,这个操作可能被存储为二进制补码或类似的东西)

二进制补码解释了如何用二进制表示一个数字。 我想我是对的。

有时候你会看到一个特殊的原因~应用在$.inArray

基本上,

 ~$.inArray("foo", bar) 

是一个更短的方法来做

 $.inArray("foo", bar) !== -1 

如果find第一个参数, $.inArray返回数组中项目的索引,如果找不到则返回-1。 这意味着如果你正在寻找一个布尔值“是数组中的值吗?”,你不能做布尔比较,因为-1是一个真值,当$ .inArray返回0(一个假值),这意味着它实际上在数组的第一个元素中find。

应用~按位运算符会使-1变为0 ,并使0变为-1。 因此,在数组中找不到值并应用按位NOT将导致falsy值(0),而所有其他值将返回非0数字,并且将表示真值结果。

 if (~$.inArray("foo", ["foo",2,3])) { // Will run } 

它会按预期工作。

expr-1时, !!~expr返回false ; 否则返回true 。 它是这样工作的:

  -1 = 1111 1111 1111 1111 1111 1111 1111 1111b // two's complement representation of -1 ~-1 = 0000 0000 0000 0000 0000 0000 0000 0000b // ~ = bitwise not = invert all bits !0 = true !true = false 

-1以外的值将至less有一个位设置为零; 反过来会创造一个真值; 申请! 运算符两次到truthy值产生布尔真实。

如果search到的string/数组包含指定的针,则上述函数返回true:

 !!~"abc".indexOf("d") // indexOf() returns -1, the expression evaluates to false !!~"abc".indexOf("a") // indexOf() returns 0, the expression evaluates to true !!~"abc".indexOf("b") // indexOf() returns +1, the expression evaluates to true 

我个人认为这是糟糕的编码,考虑你花了多less时间来解密这一行代码。 它可以很容易地写成如下:

 return this.modifiedPaths.indexOf(path) != -1; // note: indexOf returns a number >= -1 

~foo.indexOf(bar)是表示foo.contains(bar)的常用简写forms,因为contains函数不存在。

通常,由于JavaScript的“falsy”值的概念,转换为布尔值是不必要的。 在这种情况下,它用于强制函数的输出为truefalse

jQuery.inArray()为“未find”返回-1 ,其补码( ~ )为0 。 因此, ~jQuery.inArray()为“not found”返回一个falsy值( 0 ),为“found”返回一个真值(负整数)。 !! 然后将forms化的真/ false真实布尔false / true 。 所以, !!~jQuery.inArray()将为“find”赋予true ,在“未find”赋予为false

~运算符是按位补码运算符。 inArray()的整数结果是-1,找不到元素,或者是一些非负整数。 -1的二进制补码(以二进制表示为全1位)为零。 任何非负整数的位互补总是非零。

因此,当整数“i”是一个非负整数时, !!~i会是true ,当“i”正好是-1时是false

注意~总是强制它的操作数为整数; 也就是说,它强制非整数浮点值为整数,以及非数值。

Tilde是按位不是 – 它将数值的每一位反转。 一般来说,如果你在一个数字上使用~ ,它的符号将被倒置,然后减去1。

因此,当你做~0 ,你得到-1(0反转为-0,减1为-1)。

这本质上是一个精心devise的,超微观优化的方法,可以获得总是布尔值的值。

所有4个字节的int都等于这个公式-(N+1)

所以

 ~0 = -(0+1) // -1 ~35 = -(35+1) // -36 ~-35 = -(-35+1) //34 

你是对的:当indexOf调用返回-1时,这段代码将返回false ; 否则true

正如你所说,使用类似的东西会更明智

 return this.modifiedPaths.indexOf(path) !== -1; 

~运算符是按位NOT运算符。 这意味着它需要一个二进制forms的数字,并将所有的零变成1,并且变成零。

例如,二进制中的数字0是0000000 ,而-1是11111111 。 同样,1是二进制00000001 ,而-2是11111110

我的猜测是它在那里,因为它缩短了几个字符(库作者总是在后面)。 它还使用编译为本地代码时只需要几个机器周期的操作(而不是与数字进行比较)。

我同意另一个答案,这是一个矫枉过正,但也许可能在一个紧密的循环中有意义(需要性能增益估计,但否则可能会被certificate是不成熟的优化)。

我假设,因为它是一个按位操作,它是检查path是否出现在modifiedPaths中的最快(计算便宜)的方式。

As (~(-1)) === 0 ,所以:

 !!(~(-1)) === Boolean(~(-1)) === Boolean(0) === false