为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

杨__羊羊 2019-09-20 14:33:20
如果您在这里阅读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我不明白这里代字号的目的。有人可以解释一下或指向我的资源吗?
查看完整描述

3 回答

?
米脂

TA贡献1836条经验 获得超3个赞

波浪形运算符实际上并不是jQuery的一部分 - 它本身就是JavaScript中的一个NOT运算符。


参见蒂尔德的神秘之处(〜)。


您在实验中得到了奇怪的数字,因为您正在对整数执行按位逻辑运算(据我所知,可能存储为两个补码或类似的东西......)


两个补码解释了如何用二进制表示数字。我想我是对的。


查看完整回答
反对 回复 2019-09-20
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

!!~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。


查看完整回答
反对 回复 2019-09-20
  • 3 回答
  • 0 关注
  • 462 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信