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

我在一个答案里看到了,我以前从没见过。

这是什么意思?


当前回答

~indexOf(item)经常出现,这里的答案很好,但可能有些人只需要知道如何使用它并“跳过”理论:

   if (~list.indexOf(item)) {
     // item in list
   } else {
     // item *not* in list
   }

其他回答

在indexOf()表达式之前使用它可以有效地得到一个真/假的结果,而不是直接返回的数值索引。

如果返回值为-1,则~-1为0,因为-1是一个全为1位的字符串。任何大于或等于零的值都会给出一个非零的结果。因此,

if (~someString.indexOf(something)) {
}

将导致if代码在"someString"中"something"时运行。如果您尝试直接使用. indexof()作为布尔值,那么这将不起作用,因为有时它会返回零(当“something”位于字符串的开头时)。

当然,这也是可行的:

if (someString.indexOf(something) >= 0) {
}

而且它也没那么神秘了。

有时候你还会看到这个:

var i = ~~something;

像这样使用两次~操作符是将字符串转换为32位整数的快速方法。第一个~进行转换,第二个~将位翻转回去。当然,如果运算符被应用到不能转换为数字的东西上,结果就是NaN。(编辑-实际上是第二个~首先被应用,但你懂的。)

~是一个逐位操作符,将其操作数中的所有位翻转。

例如,如果你的数字是1,它的IEEE 754浮点数的二进制表示(JavaScript处理数字的方式)将是…

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()找到的返回值转换为真值(而将未找到的返回值转换为假值)也是一个(通常)不清楚的技巧,人们经常使用它的副作用是将数字截断为32位(并通过将其翻倍来降低其小数点后的位置,实际上与Math.floor()用于正数相同)。

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

现在JavaScript有了Array.prototype.includes()和String.prototype.includes(),这也不那么重要了。它们返回一个布尔值。如果您的目标平台支持它,您应该更倾向于使用它来测试字符串或数组中是否存在值。

对于那些考虑使用波浪号技巧从indexOf结果创建真值的人来说,在String上使用includes方法更显式,而且没有那么神奇。

'hello world'.includes('hello') //=> true
'hello world'.includes('kittens') //=> false

请注意,这是ES 2015的新标准方法,所以它不能在旧的浏览器上工作。在重要的情况下,考虑使用String.prototype.includes polyfill。

该特性也适用于使用相同语法的数组:

['apples', 'oranges', 'cherries'].includes('apples') //=> true
['apples', 'oranges', 'cherries'].includes('unicorns') //=> false

如果你需要更老的浏览器支持,这里是Array.prototype.includes polyfill。

~是位非操作符,~x与-(x+1)大致相同。在某种程度上,这更容易理解。所以:

~2;    // -(2+1) ==> -3

考虑(x + 1)。-1可以执行这个操作得到0。

换句话说,~与一定范围的数值一起使用将只对-1输入值产生假值(从0强制为假),否则,任何其他真值。

我们知道,-1通常被称为哨兵值。在C语言中,它用于许多函数,成功返回>= 0值,失败返回-1值。这与JavaScript中indexOf()的返回值规则相同。

用这种方式检查子字符串在另一个字符串中的存在/不存在是很常见的

var a = "Hello Baby";

if (a.indexOf("Ba") >= 0) {
    // found it
}
if (a.indexOf("Ba") != -1) { 
    // found it
}

if (a.indexOf("aB") < 0) { 
    // not found
}
if (a.indexOf( "aB" ) == -1) { 
    // not found
}

但是,通过下面的~来实现会更容易

var a = "Hello Baby";

~a.indexOf("Ba");         // -7   -> truthy
if (~a.indexOf("Ba")) {   // true
    // found it
}

~a.indexOf("aB");         // 0    -> falsy
!~a.indexOf("aB");        // true
if (!~a.indexOf( "aB" )) {  // true
    // not found
}

你不知道JS:类型和语法Kyle Simpson

~indexOf(item)经常出现,这里的答案很好,但可能有些人只需要知道如何使用它并“跳过”理论:

   if (~list.indexOf(item)) {
     // item in list
   } else {
     // item *not* in list
   }