~~(“双波浪号”)在 Javascript 中的作用是什么?

新手上路,请多包涵

我今天在查看在线游戏物理库时遇到了 ~~ 运算符。我知道单个 ~ 是按位 NOT,这会使 ~~ 成为 NOT 的 NOT,这会返回相同的值,不是吗?

原文由 Shane Tomlinson 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 791
2 个回答

它会删除小数点后的所有内容,因为按位运算符会将其操作数隐式转换为带符号的 32 位整数。无论操作数是(浮点)数字还是字符串,这都有效,结果是数字。

换句话说,它产生:

 function(x) {
  if(x < 0) return Math.ceil(x);
  else return Math.floor(x);
}

仅当 x 在 -(2 31 ) 和 2 31 - 1 之间时。否则,将发生溢出并且数字将“回绕”。

这可能被认为对将函数的字符串参数转换为数字很有用,但是由于溢出的可能性以及与非整数一起使用是不正确的,我不会以这种方式使用它,除了“代码高尔夫”( 以牺牲可读性和健壮性为代价,毫无意义地从程序的源代码中删除字节)。我会使用 +xNumber(x) 代替。


这是 NOT 中的 NOT

例如,数字 -43.2 是:

-43.2 10 = 1111111111111111111111111010101 2

作为带符号(二进制补码)的 32 位二进制数。 (JavaScript 忽略小数点后的内容。)反转位给出:

非 -43 10 = 00000000000000000000000000101010 2 = 42 10

再次反转给出:

不是 42 10 = 11111111111111111111111111010101 2 = -43 10

这与 Math.floor(-43.2) 的不同之处在于负数向零四舍五入,而不是远离它。 (等于 -44 的 floor 函数总是向下舍入到下一个较小的整数,无论该数字是正数还是负数。)

原文由 PleaseStand 发布,翻译遵循 CC BY-SA 3.0 许可协议

第一个 ~ 运算符将操作数强制为整数(可能在将值强制为字符串或布尔值之后),然后反转最低 31 位。官方的 ECMAScript 数字都是浮点数,但有些数字在 SpiderMonkey 引擎中实现为 31 位整数。

您可以使用它将 1 元素数组转换为整数。浮点数根据 C 规则转换,即。小数部分的截断。

第二个 ~ 运算符然后将位反转,因此您知道您将得到一个整数。这与在条件语句中将值强制转换为布尔值不同,因为空对象 {} 的计算结果为 true,而 ~~{} 的计算结果为 false。

 js>~~"yes"
0
js>~~3
3
js>~~"yes"
0
js>~~false
0
js>~~""
0
js>~~true
1
js>~~"3"
3
js>~~{}
0
js>~~{a:2}
0
js>~~[2]
2
js>~~[2,3]
0
js>~~{toString: function() {return 4}}
4
js>~~NaN
0
js>~~[4.5]
4
js>~~5.6
5
js>~~-5.6
-5

原文由 Shanti 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题