小编典典

!!〜(not not tilde/bang bang tilde)如何改变“contains/included” Array方法调用的结果?

javascript

如果您在此处的jQueryinArray页面上阅读了注释,则会有一个有趣的声明:

!!~jQuery.inArray(elm, arr)

现在,我相信双感叹号会将结果转换为typeboolean,其值为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

我不明白这里的波浪符号的目的。有人可以解释一下还是将我指向资源?


阅读 300

收藏
2020-05-01

共3个答案

小编典典

波浪号运算符实际上根本不是jQuery的一部分-在JavaScript本身中是按位NOT运算符。

参见 The Great Mystery of the Tilde(~).

您在实验中得到了奇怪的数字,因为您正在对整数执行按位逻辑运算(就我所知,整数可能存储为二进制补码或类似的数字…)

_二进制补码_说明了如何用二进制表示数字。我想我是对的。

2020-05-01
小编典典

!!~expr评估false何时expr-1否则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将至少一位设置为零;否则为0。反转它会产生一个真实的价值;将!运算符两次应用于真实值会返回布尔值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评估为假,因此厌恶无法可靠地用于测试-1
2020-05-08
小编典典

您有时会~在前面看到一个特定的原因$.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
}

并且它将按预期工作。

2020-05-08