var attr = ~'input,textarea'.indexOf( target.tagName.toLowerCase() ) ? 'value' : 'innerHTML'
我在一个答案中看到了它,而且我以前从未见过它。
这是什么意思?
~是一个位运算符,它翻转其操作数中的所有位。
~
例如,如果您的数字是,它的IEEE 754 浮点数(JavaScript 如何处理数字)1的二进制表示将是......
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()
indexOf()
Math.floor()
我说 不清楚 ,因为它的用途并不是很明显。通常,您希望您的代码与阅读它的其他人清晰地交流。虽然使用~可能 看起来很酷 ,但它通常太聪明了。:)
现在 JavaScript 具有Array.prototype.includes()和String.prototype.includes(). 这些返回一个布尔值。如果您的目标平台支持它,您应该更喜欢它来测试字符串或数组中是否存在值。
Array.prototype.includes()
String.prototype.includes()