如果您在此处的jQueryinArray页面上阅读了注释,则会有一个有趣的声明:
inArray
!!~jQuery.inArray(elm, arr)
现在,我相信双感叹号会将结果转换为typeboolean,其值为true。我不明白的是,~在所有这些操作中,tilde()运算符的用途是什么?
boolean
true
~
var arr = ["one", "two", "three"]; if (jQuery.inArray("one", arr) > -1) { alert("Found"); }
重构if语句:
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。
-2
~!!~jQuery.inArray("one", arr) // -2
我不明白这里的波浪符号的目的。有人可以解释一下还是将我指向资源?
波浪号运算符实际上根本不是jQuery的一部分-在JavaScript本身中是按位NOT运算符。
参见 The Great Mystery of the Tilde(~). 。
您在实验中得到了奇怪的数字,因为您正在对整数执行按位逻辑运算(就我所知,整数可能存储为二进制补码或类似的数字…)
_二进制补码_说明了如何用二进制表示数字。我想我是对的。
!!~expr评估false何时expr为-1否则true。与相同expr != -1,只有断线*
!!~expr
false
expr
-1
expr != -1
之所以有效,是因为JavaScript按位运算将操作数转换为二进制补码形式的32位有符号整数。因此!!~-1评估如下:
!!~-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将至少一位设置为零;否则为0。反转它会产生一个真实的价值;将!运算符两次应用于真实值会返回布尔值true。
0
!
当与一起使用时.indexOf(),我们只想检查结果是否为-1:
.indexOf()
!!~"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
您有时会~在前面看到一个特定的原因$.inArray。
$.inArray
基本上,
~$.inArray("foo", bar)
是一种较短的方法
$.inArray("foo", bar) !== -1
$.inArray如果找到第一个参数,则返回数组中该项的索引,如果找不到第一个参数,则返回-1。这意味着,如果要查找“此值在数组中吗?”的布尔值,则不能进行布尔值比较,因为-1是真实值,并且$ .inArray返回0(虚假值) ),则表示其实际位于数组的第一个元素中。
应用~按位运算符导致-1变为0,并使0变为-1。因此,在数组中找不到该值并应用按位NOT不会得出虚假的值(0),其他所有值将返回非0的数字,并表示真实结果。
if (~$.inArray("foo", ["foo",2,3])) { // Will run }
并且它将按预期工作。