Javascript 怎么样!!~(非平铺/邦邦平铺)更改'的结果;包含/包含';数组方法调用?

Javascript 怎么样!!~(非平铺/邦邦平铺)更改'的结果;包含/包含';数组方法调用?,javascript,jquery,operators,bitwise-operators,Javascript,Jquery,Operators,Bitwise Operators,如果您阅读jQueryinArray页面上的注释,会发现一个有趣的声明: !!~jQuery.inArray(elm, arr) 现在,我相信一个双感叹号会将结果转换为类型boolean,值为true。我不明白的是tilde(~)操作符在这一切中有什么用途 var arr = ["one", "two", "three"]; if (jQuery.inArray("one", arr) > -1) { alert("Found"); } 重构if语句: if (!!~jQuery.i

如果您阅读jQuery
inArray
页面上的注释,会发现一个有趣的声明:

!!~jQuery.inArray(elm, arr) 
现在,我相信一个双感叹号会将结果转换为类型
boolean
,值为
true
。我不明白的是tilde(
~
)操作符在这一切中有什么用途

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的一部分——它在JavaScript中是一个按位NOT操作符

你在实验中得到了奇怪的数字,因为你在对一个整数执行位逻辑运算(据我所知,它可能被存储为2的补码或类似的东西…)


解释如何用二进制表示数字。我想我是对的。

运算符是按位补码运算符。当找不到元素时,
inArray()
的整数结果要么是-1,要么是某个非负整数。-1的按位补码(以二进制表示为所有1位)为零。任何非负整数的位补码总是非零

因此,
~当整数“i”为非负整数时,i
将为
true
;当“i”正好为-1时,i将为
false


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

Tilde是按位非-它将值的每一位反转。一般的经验法则是,如果你对一个数字使用
~
,它的符号会颠倒,然后减去1

因此,当您执行
~0
时,您将得到-1(0反转为-0,减去1为-1)


它本质上是一种精细的、超微观优化的方法,用于获取始终为布尔值。

运算符是按位NOT运算符。这意味着它接受二进制形式的数字,并将所有的零转换为一,将一转换为零


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

有时你会看到
~
应用在
$.inArray
前面

基本上

~$.inArray("foo", bar)
这是一个较短的方法

$.inArray("foo", bar) !== -1
$.inArray
如果找到第一个参数,则返回数组中项的索引;如果未找到,则返回-1。这意味着,如果要查找布尔值“数组中是否存在此值?”,则无法进行布尔比较,因为-1是真实值,当$.inArray返回0(一个假值)时,表示它实际位于数组的第一个元素中

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

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

它将按预期工作。

jQuery.inArray()
返回“未找到”的
-1
,其补码(
~
)为
0
。因此,
~jQuery.inArray()
为“未找到”返回一个假值(
0
),为“找到”返回一个真值(一个负整数)<代码>然后将falsy/truthy形式化为实布尔值
false
/
true
。所以,
~jQuery.inArray()
将为“已找到”给出
true
,为“未找到”给出
false

~当
expr
-1
时,expr
计算为
false
,否则
true

它与
expr!=-1
,仅断开*


它的工作原理是将操作数转换为2的补码格式的32位有符号整数。因此
~-1
的评估如下:

   -1 = 1111 1111 1111 1111 1111 1111 1111 1111b // two's complement representation of -1
  ~-1 = 0000 0000 0000 0000 0000 0000 0000 0000b // ~ is bitwise not (invert all bits)
   !0 = true                                     // ! is logical not (true for falsy)
!true = false                                    // duh
-1
之外的值将至少有一位设置为零;颠倒它将创造真实的价值;应用
运算符两次返回布尔值true

.indexOf()
一起使用时,我们只想检查结果是否为
-1

!!~"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


*
~8589934591
的计算结果为false,因此无法可靠地使用此讨厌的对象来测试
-1
您是对的:当
indexOf
调用返回-1时,此代码将返回
false
;否则
true

正如你所说,使用类似于

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

我的猜测是,它之所以存在,是因为它短了几个字符(图书馆的作者们总是追求的)。它还使用在编译成本机代码时只需要几个机器周期的操作(与数字比较相反)


我同意另一个答案,即这是一种过度杀伤力,但在紧循环中可能有意义(尽管需要性能增益估计,否则可能会导致过早优化)。

我假设,由于它是按位操作,因此它是最快的(计算成本较低)检查路径是否显示在修改后的路径中的方法。

作为
(-1))==0,因此:

!!(~(-1)) === Boolean(~(-1)) === Boolean(0) === false
~foo.indexOf(bar)
是表示
foo.contains(bar)
的常用速记,因为
contains
函数不存在


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

所有4个字节的
~
~0   = -(0+1)   // -1
~35  = -(35+1)  // -36 
~-35 = -(-35+1) //34