在表达式之前,代字号在做什么?
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
,则~-1
为0
因为-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