var attr = ~'input,textarea'.indexOf( target.tagName.toLowerCase() )
? 'value'
: 'innerHTML'
我在一个答案里看到了,我以前从没见过。
这是什么意思?
var attr = ~'input,textarea'.indexOf( target.tagName.toLowerCase() )
? 'value'
: 'innerHTML'
我在一个答案里看到了,我以前从没见过。
这是什么意思?
当前回答
在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(),这也不那么重要了。它们返回一个布尔值。如果您的目标平台支持它,您应该更倾向于使用它来测试字符串或数组中是否存在值。
~是位非操作符,~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
}
对于那些考虑使用波浪号技巧从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。
在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。(编辑-实际上是第二个~首先被应用,但你懂的。)