【问题标题】:Javascript - Weird if syntaxJavascript - 奇怪的语法
【发布时间】: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 专家可以解释这一点吗?

【问题讨论】:

标签: javascript


【解决方案1】:

像这样的一元运算符只需要从右到左解释。 ~ 是按位“非”运算符,! 是布尔逆运算符。因此,这三个:

  • 将返回值转换为整数
  • 反转整数的位
  • 检查数字的“真实性”(零或非零,falsetrue
  • 反转布尔值
  • 再次反转

这里的~ 是最棘手的。 “搜索”例程(我猜)在找不到任何东西时返回 -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() 返回-1if() 将满足,但是找不到匹配项,因此是误报
    • @Bojangles 就像 cHao 说的,第二个例子使用 MATCH,而不是 SEARCH。
    • 好吧废话,这很尴尬......对不起:(
    猜你喜欢
    • 2011-10-25
    • 2023-03-26
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多