在表达式之前,代字号在做什么?

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

如果它是一个负数,它将被存储在二进制补码中:反转所有位并加1。

...然后翻转所有的位...

1111 1111 1111 1111 1111 1111 1111 1110

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

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

这也是一个(通常)不清楚的技巧,将indexOf()的发现返回值转换为truthy(而不会被认为是falsy),并且人们经常将它用于截断数字到32位的副作用(并通过按加倍,与Math.floor()的正数相同)。

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

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


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

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

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

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

当然,这也是有效的:

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

而且它不那么神秘。

有时候你也会看到这个:

var i = ~~something;

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


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

   if (~list.indexOf(item)) {
     // item in list
   } else {
     // item *not* in list
   }
链接地址: http://www.djcxy.com/p/2095.html

上一篇: What does a tilde do when it precedes an expression?

下一篇: How does !!~ (not not tilde/bang bang tilde) alter the result of a 'contains/included' Array method call?