!!〜(不是不用颚化/砰砰砰砰声)改变'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

链接地址: http://www.djcxy.com/p/2093.html

上一篇: How does !!~ (not not tilde/bang bang tilde) alter the result of a 'contains/included' Array method call?

下一篇: Best way to find if an item is in a JavaScript array?