Javascript 怎么样!!~(非平铺/邦邦平铺)更改'的结果;包含/包含';数组方法调用?
如果您阅读jQueryJavascript 怎么样!!~(非平铺/邦邦平铺)更改'的结果;包含/包含';数组方法调用?,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
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
之外的值将至少有一位设置为零;颠倒它将创造真实的价值;应用对truthy值使用code>运算符两次返回布尔值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