关于Javascript: if条件语法很奇怪

Javascript - Weird if syntax

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

1
2
3
4
5
// 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"运算符,!是布尔反比。因此,这三个:

  • 将返回值转换为整数
  • 反转整数的位
  • 检查数字是否"真实"(零或非零、falsetrue)
  • 反转布尔值
  • 再次反转

这里的~是最棘手的。"搜索"程序(我推测)在找不到任何东西时返回-1~操作符将-1转换为0,因此,如果找到目标,~允许我们将"搜索"返回值解释为true非零,如果没有,false为零。

随后两次使用!会强制结果为真正的布尔值。应用两次,保持truefalse的感觉。请注意,在这个特定的代码中,强制转换为布尔值完全不必要;if语句的正常语义只需~运算符的结果就可以正常工作。


基本上,.search返回找到结果的位置,如果不匹配则返回-1。普通人只会写:

1
if( varA.search(re) > -1)

但就我个人而言,我只会使用:

1
if( varA.match(re))


用外行术语

1
 ~

正在-(n + 1)和

1
!!

第一个bang将数字强制转换为布尔值,第二个则撤消第一个bang执行的逻辑not。

看看这个网站。有几个解释

~, !, +, & –