在Javascript中,~~(double-tilde)做什么?

在Javascript中,~~(double-tilde)做什么?,javascript,Javascript,我今天在查看一个在线游戏物理库时遇到了~~操作员。我知道一个~是一个按位的NOT,这会使~~成为NOT的NOT,它会返回相同的值,不是吗?这个~似乎可以-(N+1)。因此,~2=-(2+1)=-3如果你在-3上再做一次,它会把它转回来:~-3=-(-3+1)==2它可能只是以一种循环的方式将一个字符串转换成一个数字 请参阅此线程: 此外,此处还提供了更详细的信息:它删除小数点后的所有内容,因为按位运算符将其操作数隐式转换为有符号32位整数。无论操作数是(浮点)数字还是字符串,并且结果是数字,此操

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

这个
~
似乎可以
-(N+1)
。因此,
~2=-(2+1)=-3
如果你在-3上再做一次,它会把它转回来:
~-3=-(-3+1)==2
它可能只是以一种循环的方式将一个字符串转换成一个数字

请参阅此线程:


此外,此处还提供了更详细的信息:

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

换句话说,它产生:

function(x) {
  if(x < 0) return Math.ceil(x);
  else return Math.floor(x);
}
函数(x){
if(x<0)返回Math.ceil(x);
否则返回数学层(x);
}
仅当x介于-(231)和231-1之间时。否则,将发生溢出,数字将“环绕”

这在将函数的字符串参数转换为数字时可能很有用,但由于可能会溢出,并且不适合与非整数一起使用,因此除了“code golf”之外,我不会以这种方式使用它(即,以牺牲可读性和健壮性为代价,毫无意义地从程序的源代码中删除字节)。我将使用
+x
Number(x)


这是何等的非此即彼 例如,数字-43.2是:

-43.210 = 111111111111111111111111110101012 作为有符号(2的补码)32位二进制数。(JavaScript忽略小数点后的内容。)将位反转为:

非-4310=00000000000000000000 1010102=4210 再次反转可以得到:

非4210=11111111111111 0101012=-4310
这与
Math.floor(-43.2)
不同,负数向零舍入,而不是向零舍入。(等于-44的floor函数总是向下舍入到下一个较低的整数,不管该数字是正整数还是负整数。)

给定的
~N
-(N+1)
~~N
然后是
-((N+1)+1)
。这显然会导致一个。

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

在ECMAScript 6中,
~
的等价物是:

通过删除任何小数位数返回数字的整数部分。它不会对任何数字进行四舍五入

polyfill:

function trunc(x) {
    return x < 0 ? Math.ceil(x) : Math.floor(x);
}
函数trunc(x){
返回x<0?数学层(x):数学层(x);
}

下面是一个如何有效使用此运算符的示例,使用它是有意义的:

leftOffset = -(~~$('html').css('padding-left').replace('px', '') + ~~$('body').css('margin-left').replace('px', '')),
资料来源:


只是一个小小的警告。这里的其他答案让我陷入了一些麻烦

其目的是删除浮点数小数点后的任何内容,但它有一些特殊情况,使其成为bug的危险。我建议避免~~

首先,~~对非常大的数字不起作用

~~10000000000==-727279968

或者,使用
Math.trunc()
(如Gajus所述,
Math.trunc()
返回浮点数的整数部分,但仅在符合ECMAScript 6的JavaScript中可用)。对于非ECMAScript-6环境,您始终可以通过以下操作创建自己的
Math.trunc()

if(!Math.trunc){
Math.trunc=函数(值){
返回数学符号(值)*数学地板(数学abs(值));
}
}
波浪(~)有一个算法-(N+1)

例如:

~0 = -(0+1) = -1
~5 = -(5+1) = -6
~-7 = -(-7+1) = 6
双瓦线为-(N+1)+1)

例如:

~~5 = -(-(5+1)+1) = 5
~~-3 = -(-(-3+1)+1) = -3
~~~2 = -(-(-(2+1)+1)+1) = -3
~~~3 = -(-(-(3+1)+1)+1) = -4
三重瓦片为-((-(N+1)+1)+1)

例如:

~~5 = -(-(5+1)+1) = 5
~~-3 = -(-(-3+1)+1) = -3
~~~2 = -(-(-(2+1)+1)+1) = -3
~~~3 = -(-(-(3+1)+1)+1) = -4

将字符串转换为数字

console.log(~~-1);    // -1
console.log(~~0);     // 0
console.log(~~1);     // 1
console.log(~~"-1");  // -1
console.log(~~"0");   // 0
console.log(~~"1");   // 1
console.log(~~true);  // 1
console.log(~~false); // 0
~-1是0

if (~someStr.indexOf("a")) {
  // Found it
} else  {
  // Not Found
}

必须向下滚动到Matt的评论才能看到它的正确使用;)感谢这里的所有示例,Shanti,它真的很有帮助!另外
~~未定义的//0
~~null//0
从技术上讲,您的顺序是错误的。第二个
~
执行您描述的操作,第一个
~
执行的操作,反之亦然。
~
运算符是一元运算符,从右到左解释
~~X
就像
~(~X)
不像
(~~)X
(这将是语法错误)感谢Drackir的链接!这就是说,
~~
是一种简捷的方法(可能是一个很好的解决方案?),用于创建,但显然.JSLint会抱怨使用了
~
。尝试Math.trunc()有点奇怪,~~比Math.trunc快。尽管如此,并不是一切都与速度有关;可读性也是一样。~~和Math.trunc之间有一个重要的区别:如果你传递一个字符串,或NaN或任何不是数字的东西,Math.trunc将返回NaN,~~将始终返回一个数字,在这种情况下,它将返回0。根据。Math.trunc比Chrome 59+中的~~稍微快一点。另请参阅