小编典典

波浪号在表达式之前有什么作用?

all

var attr = ~'input,textarea'.indexOf( target.tagName.toLowerCase() )
           ? 'value'
           : 'innerHTML'

我在一个答案中看到了它,而且我以前从未见过它。

这是什么意思?


阅读 70

收藏
2022-06-16

共1个答案

小编典典

~是一个位运算符,它翻转其操作数中的所有位。

例如,如果您的数字是,它的IEEE 754
浮点数
(JavaScript
如何处理数字)1的二进制表示将是......

0011 1111 1111 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

因此~将其操作数转换为 32 位整数(JavaScript 中的位运算符会这样做)…

0000 0000 0000 0000 0000 0000 0000 0001

如果它是负数,它将存储在 2 的补码中:反转所有位并加 1。

…然后翻转所有位…

1111 1111 1111 1111 1111 1111 1111 1110

那么它有什么用呢?什么时候可以使用它?

它有很多用途。如果你正在编写低级的东西,它很方便。如果您分析了您的应用程序并发现了瓶颈,则可以通过使用按位技巧(作为更大袋子中的一种
可能的工具)来提高其性能。

这也是一个(通常)不清楚的 技巧 ,将indexOf()‘s found 返回值变为 值(同时将 not found 设为
falsy ),人们经常使用它来将数字截断为 32 位(并通过将其加倍来删除小数位,实际上与正数相同)。 Math.floor()

我说 不清楚 ,因为它的用途并不是很明显。通常,您希望您的代码与阅读它的其他人清晰地交流。虽然使用~可能 看起来很酷 ,但它通常太聪明了。:)

现在 JavaScript
具有Array.prototype.includes()String.prototype.includes().
这些返回一个布尔值。如果您的目标平台支持它,您应该更喜欢它来测试字符串或数组中是否存在值。

2022-06-16