~
is a 翻转其操作数中的所有位。
例如,如果您的电话号码是1
,其二进制表示IEEE 754 浮点 https://en.wikipedia.org/wiki/IEEE_754-1985(JavaScript 如何处理数字)将是...
0011 1111 1111 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
So ~
将其操作数转换为 32 位整数(JavaScript 中的按位运算符就是这样做的)...
0000 0000 0000 0000 0000 0000 0000 0001
If it were a negative number, it'd be stored in 2's complement: invert all bits and add 1.
...然后翻转其所有位...
1111 1111 1111 1111 1111 1111 1111 1110
那么它有什么用呢?什么时候可以使用它?
它有很多用途。如果您正在编写低级内容,那么它会很方便。如果您分析了应用程序并发现了瓶颈,则可以通过使用按位技巧(如possible工具放在一个更大的袋子里)。
这也是(通常)不清楚的trick转动indexOf()
's found返回值到truthy(在制作时未找到 as falsy),人们经常使用它,因为它有将数字截断为 32 位的副作用(并通过将其加倍来去掉小数位,实际上与Math.floor()
对于正数)。
I say unclear因为它的用途并不是很明显。一般来说,您希望您的代码能够与阅读它的其他人清晰地沟通。使用时~
may 看起来不错,它通常太聪明了。 :)
现在 JavaScript 已经不再那么重要了Array.prototype.includes() https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes and String.prototype.includes() https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes。它们返回一个布尔值。如果您的目标平台支持它,您应该更喜欢用它来测试字符串或数组中是否存在值。