在expression式之前,代字号是干什么的?

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

我在一个答案中看到了,我从来没有见过它。

这是什么意思?

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

例如,如果你的数字是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()的返回值转化为truthy (而不会被认为falsy ),人们经常使用它来截断数字的副作用到32位(并通过下降的小数位加倍,与Math.floor()的正数一样)。

我说不清楚,因为它不是很明显,它被用于什么。 一般来说,你希望你的代码能够清楚地与其他读者交stream。 虽然使用~可能看起来很酷 ,但它对于自己的好处通常是太聪明了。 🙂

现在,JavaScript也具有较less的相关性,包括Array.prototype.includes()String.prototype.includes() 。 这些返回一个布尔值。 如果你的目标平台支持它,你应该更喜欢这个来testingstring或数组中是否存在一个值。

indexOf()expression式之前使用它会有效地给你一个真/假的结果,而不是直接返回的数字索引。

如果返回值是-1 ,那么~-10因为-1是一个全1位的string。 任何大于或等于零的值都会给出一个非零的结果。 从而,

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

当“someString”处于“someString”时,会导致if代码运行。 如果试图直接使用.indexOf()作为布尔值,那么这将不起作用,因为它有时会返回零(当string的开头是“something”时)。

当然,这也是有效的:

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

而且不那么神秘。

有时候你也会看到这个:

 var i = ~~something; 

像这样两次使用~运算符是将string转换为32位整数的快速方法。 第一个~进行转换,第二个~将这些位翻转回来。 当然,如果运算符被应用于某些不能转换为数字的东西,那么结果就是NaN 。 ( 编辑 – 实际上这是第二个,这是第一个应用,但你明白了。)

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

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

对于那些考虑使用波浪诡计从indexOf结果创build真实值的人来说,它更加明确,并且具有更less的魔力,而不是使用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填充如果您需要较旧的浏览器支持。

~是按位NOT运算符 , 〜x与-(x+1)大致相同。 这比较容易理解。 所以:

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

考虑-(x+1)-1可以执行该操作产生一个0

换句话说,与一系列数字值一起使用,只会产生-1input值的false0迫使false ),否则,会产生任何其他的truthy值。

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

以这种方式检查另一个string substring的存在/不存在是很常见的

 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 }