Javascript-奇怪的if语法

Javascript-奇怪的if语法,javascript,Javascript,我正在浏览其他人编写的一些代码,我注意到这个奇怪的javascript if语法。。基本上,它看起来是这样的: // This is understandable (but I dont know if it have relevance) var re = new RegExp("^" + someVar + "_", "i"); // !!~ ??? What is this black magic? if (!!~varA.search(re)) { ... } 这是谷歌很难做到的事情

我正在浏览其他人编写的一些代码,我注意到这个奇怪的javascript if语法。。基本上,它看起来是这样的:

// This is understandable (but I dont know if it have relevance)
var re = new RegExp("^" + someVar + "_", "i");

// !!~ ??? What is this black magic?
if (!!~varA.search(re)) { ... }

这是谷歌很难做到的事情之一。。任何Javascript专家都可以解释这一点吗?

像这样的一元运算符只需要从右到左进行解释
~
是按位“not”运算符,
是布尔值的倒数。因此,这三个:

  • 将返回值转换为整数
  • 反转整数的位
  • 检查数字的“真实性”(零或非零,
    false
    true
  • 反转布尔值
  • 再倒过来
~
这里是最棘手的。“搜索”例程(我猜想)在没有找到任何东西时返回
-1
~
操作符将
-1
转换为
0
,因此
~
允许用户在找到目标时将“搜索”返回值解释为
true
(非零),如果未找到目标则将其解释为
false
(零)


的后续应用-两次-强制结果为真布尔值。它被应用两次,以便保持
true
/
false
的感觉。请注意,在这个特定代码中,强制转换为布尔值是完全不必要的;
if
语句的正常语义仅适用于
~
运算符的结果。

基本上,
.search
返回查找结果的位置,或者如果不匹配,返回
-1
。正常人只会写:

if( varA.search(re) > -1)
但就我个人而言,我只会使用:

if( varA.match(re))
通俗地说

 ~ 
正在进行-(N+1) 及

第一次爆炸将数字转换为布尔值,第二次爆炸撤消第一次爆炸执行的逻辑not

请查看此网站。
它有一些解释


的可能副本的可能副本,并检查其内容。。。这是一种毫无意义的语法,在键入时可以保存0个字符,并降低可读性<代码>varA.search(re)>-1
是“兄弟”吗?我不相信这是其他双感叹号问题的重复<代码>~
大不相同。我承认,
~对我来说是新的。这是一个神秘的问题,我认为它有理由提出自己的问题。我总是喜欢一种更具表现力的方法:
if(varA.search(re)>=0)
。您的第二个示例将为
-1
返回
true
,给出一个falsepositive@Bojangles当前位置我一定错过了什么。我不认为这里有机会出现假阳性。请注意,第二个示例使用
.match
而不是
.search
。如果
varA.search()
返回
-1
,则
If()
将满足,但未找到匹配项,因此为falsepositive@Bojangles正如赵所说,第二个例子使用的是匹配,而不是搜索。废话,这很尴尬。。。对不起
:(
作为参考,
!!
在这里是完全不必要的。只有在以后存储结果并希望确保它是布尔值时,您才需要它。如果要在
if
中立即使用,它就太过分了。@cHao是的,在本例中它没有必要。@cHao事实上,您可以进一步说
~
是overkill,因为您可以只添加
+1
,所以“不匹配”返回值为falsy,“第一个位置的匹配”变为truthy。@Kolink:可以。但是,同样,
“~x”。length
:)但是我从来没有为任何合法的目的使用过
~
,我相信大多数其他程序员也不会使用它。好吧,如果你选择极简主义,但如果你鼓励可读性…呵呵。
!!