怎么!!〜(不是波浪形/波浪形波浪号)改变'包含/包含'数组方法调用的结果?

如果您在这里阅读jQuery 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

我不明白这里代字号的目的。有人可以解释一下或指向我的资源吗?


杨__羊羊
浏览 463回答 3
3回答

米脂

波浪形运算符实际上并不是jQuery的一部分 - 它本身就是JavaScript中的一个NOT运算符。参见蒂尔德的神秘之处(〜)。您在实验中得到了奇怪的数字,因为您正在对整数执行按位逻辑运算(据我所知,可能存储为两个补码或类似的东西......)两个补码解释了如何用二进制表示数字。我想我是对的。

白衣染霜花

!!~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将至少一个位设置为零之外的值; 颠倒它将创造一个真正的价值; 将!运算符两次应用于truthy值返回boolean 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。
打开App,查看更多内容
随时随地看视频慕课网APP