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
1111 1111 1111 1111 1111 1111 1111 1110
现在 JavaScript 已经有 Array.prototype.includes()
和 String.prototype.includes()
,所以这不再那么重要了。它们返回一个布尔值。如果你的目标平台支持它们,你应该优先使用它们来测试字符串或数组中是否存在某个值。
value = value || default
是一种常见且有效的习惯用法,只要你知道什么时候能够使用它和不能使用它。 - gmanv = t ? a : b;
。我发现这种写法比通常分成5行以上的var v; if (t} { v = a; } else { v = b; }
清晰得多,也比通常要占用4行以上的var v = b; if (t) { v = a; }
清晰。但是,我知道很多不熟悉? :
运算符的人会更喜欢第二或第三种写法。我发现第一种写法更易读。 我同意这个一般原则,即让代码清晰,不用hack。我想我只是觉得一旦我学会了~v.indexOf('...')
,就非常清晰。 - gman~
是惯用语。它在技术上是语言规范的一部分,但并不是语言在普遍使用中的一部分。 - worc在 indexOf()
表达式之前使用它,可以有效地将直接返回的数字索引转换为真值/假值结果。
如果返回值是 -1
,那么 ~-1
就是 0
,因为 -1
是所有 1 位组成的字符串。任何大于或等于零的值都会给出非零结果。因此,
if (~someString.indexOf(something)) {
}
当"something"在"someString"中时,将会触发if
代码的运行。 如果您直接使用.indexOf()
作为布尔值,则无法正常工作,因为有时它返回零(当"something"位于字符串开头时)。
当然,这也可以实现:
if (someString.indexOf(something) >= 0) {
}
并且这要少得多神秘。
有时你也会看到这个:
var i = ~~something;
使用两次~
运算符是将字符串快速转换为32位整数的一种方法。第一个~
执行转换,第二个~
将位反转回来。当然,如果该运算符应用于无法转换为数字的内容,则会得到NaN
作为结果。(编辑 — 其实是先应用第二个~
,但你明白我的意思。)
~
等同于-(x + 1)
。 - Fabrício Matté| 0
,这种情况下只需要进行一次操作即可。 - alex~~
的简单应用。 - Pointy~
是 按位非运算符,~x
大致相当于 -(x+1)
。这更容易理解,有点类似于负数。因此:
~2; // -(2+1) ==> -3
考虑-(x+1)
。 -1
可以使用该操作来生成0
。~
与一定范围的数字值一起使用仅会对输入值为-1
的情况生成false(从0
强制转换为false),否则它将生成任何其他truthy值。-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
}
-(x+1)
,我会再看一眼。波浪线告诉我它正是为了弥补Javascript的基于0的本质而做的。此外,阅读时括号越少越好。 - Regular Joif (a.indexOf("Ba") > -1) {// found} //true
来少打点字。尽管比波浪线示例略长,但比您给出的两个示例要短得多,并且对于新程序员来说易于理解 var opinion = ! ~-1 ? 'more' : 'less'
。 - Hmerman6006~indexOf(item)
经常被提及,这里的答案很棒,但也许有些人只需要知道如何使用它并“跳过”理论:
if (~list.indexOf(item)) {
// item in list
} else {
// item *not* in list
}
++
和--
,因为它们“鼓励过度的巧妙性”,但一些符号如~
却幸存了下来(潜伏在阴影中)。https://github.com/airbnb/javascript/issues/540 - Shanimallist.indexOf(item) >= 0
或 ... > -1
,因为 JavaScript 是从零开始的,并没有从一开始就解决这个问题。此外,只是个人意见(与 Airbnb 相同),任何在 JavaScript 中进行有意义操作的人都知道 ++
,而虽然 --
不太常见,但含义可以推断出来。 - Regular Jomap
、forEach
等原始方法的存在,我已经有一段时间没有使用++
和--
了。我的观点更多地是关于为什么他们没有考虑到~
也过于棘手,因为无论使用哪种标准,都包括增量和减量运算符。禁止某些东西以便让CIS101变得毫无意义。 - Shanimal对于那些考虑使用波浪线技巧从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。