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】:

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

将返回值转换为整数 反转整数的位 检查数字的“真实性”(零或非零,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。 好吧废话,这很尴尬......对不起:(

以上是关于Javascript - 奇怪的语法的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript学习:JavaScript语法

前端入门12-JavaScript语法之函数

前端入门7-JavaScript语法之相关术语

JavaScript 中 Number 方法的奇怪语法

在 JavaScript 中创建范围 - 奇怪的语法

在 JavaScript 中创建范围 - 奇怪的语法