在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
,那么~-1
是0
因为-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
。
换句话说,与一系列数字值一起使用,只会产生-1
input值的false
从0
迫使false
),否则,会产生任何其他的truthy
值。
正如我们所知, -1
通常被称为哨兵价值 。 它用于许多函数返回>= 0
值为成功和-1
为C
语言失败 。 其中的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 }