var attr = ~'input,textarea'.indexOf( target.tagName.toLowerCase() )
? 'value'
: 'innerHTML'
我在一个答案中看到了它,我以前从未见过它。
这是什么意思?
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
那么它有什么用呢?什么时候可以使用它?
它有很多用途。如果你在写低级的东西,它很方便。如果您分析了应用程序并发现了瓶颈,则可以通过使用按位技巧(作为一种可能的工具放在更大的包中)来提高其性能。
将' found返回值转换为真值(同时使not found为假)也是一个(通常)不清楚的技巧,人们经常使用它来将数字截断为 32 位(并通过将其加倍来删除小数位)的副作用,实际上与正数相同)。indexOf()
Math.floor()
我说不清楚,因为它的用途并不是很明显。通常,您希望您的代码能够与阅读它的其他人清楚地交流。虽然使用~
可能看起来很酷,但它通常太聪明了。:)
现在 JavaScript 具有Array.prototype.includes()
和,它也不太相关String.prototype.includes()
。这些返回一个布尔值。如果您的目标平台支持它,您应该更喜欢使用它来测试字符串或数组中是否存在某个值。
在indexOf()
表达式之前使用它可以有效地为您提供真/假结果,而不是直接返回的数字索引。
如果返回值是-1
,则~-1
是0
因为-1
是全 1 位的字符串。任何大于或等于零的值都将给出非零结果。因此,
if (~someString.indexOf(something)) {
}
if
当“something”在“someString”中时,将导致代码运行。如果您尝试.indexOf()
直接用作布尔值,那么这将不起作用,因为有时它返回零(当“某物”位于字符串的开头时)。
当然,这也有效:
if (someString.indexOf(something) >= 0) {
}
而且它的神秘性要低得多。
有时你还会看到这个:
var i = ~~something;
~
像这样使用运算符两次是将字符串转换为 32 位整数的快速方法。第一个~
进行转换,第二个~
将位翻转回来。当然,如果运算符应用于无法转换为数字的内容,您就会得到NaN
结果。(编辑- 实际上它~
是第一个应用的第二个,但你明白了。)
该~
是按位NOT运算符,~x
是大致相同的-(x+1)
。它更容易理解,有点。所以:
~2; // -(2+1) ==> -3
考虑-(x+1)
。-1
可以执行该操作以生成0
.
换句话说,~
与一系列数值一起使用将只为输入值产生一个假(强制到false
from 0
)-1
值,否则,任何其他真值。
众所周知,-1
通常称为哨兵值。它用于返回许多功能>= 0
的值的成功和-1
对失败的C语言编写。indexOf()
JavaScript 中的返回值规则相同。
以这种方式检查另一个字符串中子字符串的存在/不存在是很常见的
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
}
~indexOf(item)
经常出现,这里的答案很好,但也许有些人只需要知道如何使用它并“跳过”理论:
if (~list.indexOf(item)) {
// item in list
} else {
// item *not* in list
}
对于那些考虑使用波浪号技巧从结果中创建真值的人来说indexOf
,使用includes
on 上String
的方法更明确且没有那么神奇。
'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。