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专家吗?
- 可能是什么的副本!!(不是)javascript中的运算符?
- 可能是两个感叹号的重复?
- 还要检查javascriptturnsmeon.com/the-tilde-operator-in-javascript
- 至于它是什么…它是一种无意义的语法,在输入时可以保存0个字符,并降低易读性。是"兄弟"吗?
- 我不相信这是其他双感叹号问题的副本。!!~与!!有很大不同。我承认,江户十一〔一〕对我来说是新的。它是神秘的,我认为它有其自身的问题。我总是更喜欢表达方式:if(varA.search(re) >= 0)。
像这样的一元运算符只需要从右向左解释。~是位"not"运算符,!是布尔反比。因此,这三个:
- 将返回值转换为整数
- 反转整数的位
- 检查数字是否"真实"(零或非零、false或true)
- 反转布尔值
- 再次反转
这里的~是最棘手的。"搜索"程序(我推测)在找不到任何东西时返回-1。~操作符将-1转换为0,因此,如果找到目标,~允许我们将"搜索"返回值解释为true非零,如果没有,false为零。
随后两次使用!会强制结果为真正的布尔值。应用两次,保持true和false的感觉。请注意,在这个特定的代码中,强制转换为布尔值完全不必要;if语句的正常语义只需~运算符的结果就可以正常工作。
- @NPE现在更新
- 作为参考,这里完全不需要!!。只有在以后存储结果并希望确定它是布尔值时才需要它。在if中立即使用,是过度杀伤力。
- @赵是的,在这个例子中没有必要。
- @曹先生,其实你可以更进一步说,江户一号〔2〕太过杀戮了,你只要加上江户一号〔3〕就可以了,所以"不匹配"的返回值是不稳定的,"第一位置匹配"就变成了真实的。
- @科林克:你可以。但是,再一次,以东十一〔四〕号。:)
- 但我从来没有将~用于任何合法目的,我相信大多数其他程序员也不会使用它。好吧,如果你想追求极简主义,但如果你鼓励可读性…呵呵。
基本上,.search返回找到结果的位置,如果不匹配则返回-1。普通人只会写:
1
| if( varA.search(re) > -1) |
但就我个人而言,我只会使用:
- 您的第二个示例将返回true作为-1,给出假阳性
- @博詹格斯:我一定错过了什么。我不认为这里有假阳性的机会。注意,第二个示例使用的是.match,而不是.search。
- 如果varA.search()返回-1,if()将满足,但没有发现匹配,因此假阳性
- @像曹先生所说的,第二个例子使用的是匹配,而不是搜索。
- 好吧,废话,那太尴尬了…对不起,:(。
- (关于倒置逻辑的草稿注释。因为某种原因,~把我弄糊涂了。)
用外行术语
正在-(n + 1)和
第一个bang将数字强制转换为布尔值,第二个则撤消第一个bang执行的逻辑not。
看看这个网站。有几个解释
~, !, +, & –