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

2022-08-30 00:45:55

我今天正在查看一个在线游戏物理库,并遇到了~~操作员。我知道一个单~是按位的不是,那会使~~~不是一个NOT,这会给相同的价值,不是吗?


答案 1

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

换句话说,它产生:

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

仅当 x 介于 -(231) 和 231 - 1 之间。否则,将发生溢出,并且数字将“环绕”。

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


这怎么是非的不

例如,数字 -43.2 是:

-43.210 = 111111111111111111111111110101012

作为有符号(二进制补码)32 位二进制数。(JavaScript 忽略了小数点之后的内容。反转位会得到:

NOT -4310 = 000000000000000000000000001010102 = 4210

再次反转给出:

不是 4210 = 111111111111111111111111110101012 = -4310

这与负数四舍五入为零的不同之处,而不是远离零。(floor 函数等于 -44,始终向下舍入到下一个较低的整数,而不管该数字是正数还是负数。Math.floor(-43.2)


答案 2

第一个 ~ 运算符强制操作数为整数(可能在将值强制为字符串或布尔值之后),然后反转最低的 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