!!〜(不是不用颚化/砰砰砰砰声)改变'contains / included'数组方法调用的结果吗?
如果您在这里阅读jQuery inArray
页面中的注释,那么会有一个有趣的声明:
!!~jQuery.inArray(elm, arr)
现在,我相信一个双重感叹号会将结果转换为boolean
类型,其值为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的一部分 - 它本身就是一个按位运算符。
看到Tilde的大奥秘(〜)。
你在实验中得到了奇怪的数字,因为你正在对一个整数执行按位逻辑操作(对于我所知,这可能被存储为二进制补码或类似的东西)
二进制补码解释了如何用二进制表示一个数字。 我认为我是对的。
有时你会看到一个特殊的原因~
应用在$.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
}
它会按预期工作。
!!~expr
expr
为-1
时, !!~expr
计算结果为false
,否则为true
。
它与expr != -1
相同,只是破碎*
它的工作原理是JavaScript按位操作将操作数转换为二进制补码格式的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
。