Javascript - 奇怪的语法
Posted
技术标签:
【中文标题】Javascript - 奇怪的语法【英文标题】:Javascript - Weird if syntax 【发布时间】:2013-09-05 14:42:04 【问题描述】:我正在查看其他人编写的一些代码,我注意到这种奇怪的 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 专家可以解释这一点吗?
【问题讨论】:
What is the !! (not not) operator in JavaScript?的可能重复 Double exclamation points?的可能重复 同时检查javascriptturnsmeon.com/the-tilde-operator-in-javascript 至于它是什么......这是一种毫无意义的语法,打字时会节省0个字符并降低易读性。varA.search(re)>-1
是“兄弟”吗
我不认为这是其他双感叹号问题的重复。 !!~
与 !!
完全不同。我承认,!!~
对我来说是新的。它是神秘的,我认为它值得提出自己的问题。我总是更喜欢更具表现力的方法:if(varA.search(re) >= 0)
。
【参考方案1】:
像这样的一元运算符只需要从右到左解释。 ~
是按位“非”运算符,!
是布尔逆运算符。因此,这三个:
false
或 true
)
反转布尔值
再次反转
这里的~
是最棘手的。 “搜索”例程(我猜)在找不到任何东西时返回 -1
。 ~
运算符将-1
转换为0
,因此~
允许将“搜索”返回值解释为true
(非零),如果找到目标,false
(零) 如果没有。
!
的后续应用(两次)强制结果为真正的布尔值。它应用了两次,以便保持true
/false
的感觉。 edit 请注意,在此特定代码中根本不需要强制转换为布尔值; if
语句的正常语义仅适用于 ~
运算符的结果。
【讨论】:
作为参考,这里完全不需要!!
。仅当您将结果存储以备后用并想确保它是布尔值时才需要它。对于在if
中立即使用,它是矫枉过正。
@cHao 是的,在 this 示例中没有必要。
@cHao 事实上你可以进一步说~
是多余的,因为你可以添加+1
所以“不匹配”返回值是假的,而“首先匹配”位置”变得真实。
@Kolink:你可以。但话又说回来,"~x".length < "x+1".length
。 :)
但我从未将~
用于任何合法目的,而且我相信大多数其他程序员也不会使用它。好吧,如果你追求极简主义,但如果你鼓励可读性......呵呵。【参考方案2】:
通俗地说
~
正在做 -(N+1) 和
!!
第一个 bang 将数字转换为布尔值,第二个 bang 撤消第一个 bang 执行的逻辑非。
看看这个网站。 它有一些解释
http://dreaminginjavascript.wordpress.com/2008/07/04/28/
【讨论】:
【参考方案3】:基本上,.search
返回找到结果的位置,如果不匹配则返回-1
。 普通人只会写:
if( varA.search(re) > -1)
但我个人只会使用:
if( varA.match(re))
【讨论】:
您的第二个示例将返回true
for -1
,给出误报
@Bojangles:我一定是错过了什么。我在这里没有看到误报的机会。请注意,第二个示例使用.match
而不是.search
。
如果varA.search()
返回-1
,if()
将满足,但是找不到匹配项,因此是误报
@Bojangles 就像 cHao 说的,第二个例子使用 MATCH,而不是 SEARCH。
好吧废话,这很尴尬......对不起:(
以上是关于Javascript - 奇怪的语法的主要内容,如果未能解决你的问题,请参考以下文章