什么是JavaScript`_ | _`?

当我看到这个expression式时,我正在通过javascript解决问题,即将stringparsing为其组成名称,运算符和括号。

return accept(")") ? _|_ : e; 

那是什么_|_ ? 那是使用节点的_function吗? 我查找了文档,但没有find任何。

当我尝试使用它时,会发生这种情况:

 > 5 5 > true ? _|_ : 0 ReferenceError: _ is not defined at eval:1:1 at eval at n.<anonymous> 

作为一个澄清,variables_没有在代码中的任何地方定义。

这是在节点v8.1.3上运行,但也适用于Chrome本地浏览器JS。

这里是代码:

 function tokenise(string) { const tokens = string.match( /[az]+|\(|\)|[!#$%&*+\-\/<=>@^_.,;]+/gi ) || []; const accept = s => s===tokens[0] && tokens.shift() ; const unaccept = s => s!==tokens[0] && tokens.shift() ; const singles = (e) => ( e = unaccept(")") ) ? [ e, ...brackets() ] : [] ; const brackets = (e) => accept("(") ? ( e = brackets(), accept(")") || _|_ , [ e, ...brackets() ] ) : singles() ; try { let e = brackets(); return accept(")") ? _|_ : e ; } catch(_) { return null; } } 

_|_在JavaScript中没有特殊含义,只是一个| ( 按位或 )与标识符_两侧的expression式。

该代码检查调用accept的结果,如果它真的,则返回|的结果 操作; 如果不是,则返回e的值。

那是使用节点的_function吗?

_在节点代码中并不特殊。 在REPL(only)中,它是一个接收最近评估expression式的结果的variables; 细节在这里 。

作为一个澄清,variables_没有在代码中的任何地方定义。

这意味着如果accept(")")返回一个真值,代码将抛出一个ReferenceError因为_是一个未声明的标识符。 如果这是作者的意图,那么就不需要| 但是在一个现在被删除的答案中,georg指出他们可能已经使用_|_来表示底部 (“一种从未成功完成的计算”)的math概念,其符号为 。 在任何情况下,作者似乎都使用它来在expression式上下文中强制执行exception(因为throw是一个语句;尽pipe如此,有人可能会在expression式语境中允许它)。

它需要一个variables_并使用按位或| 本身。

结果,你得到一个32位的整数。

除了这里已经详细解释的内容之外,你的代码是相当普通的JavaScript,没有什么特别的。

我用一种以上的编程语言编写过相似的代码,当使用语法冗长来生成类似于文字艺术(又称ASCII艺术)的假想的滑稽表情时,那些使代码看起来很奇怪的代码也是100%有效的代码。

你的代码示例提醒了那些愚蠢的笑话之一,就像有人引入了一个带有段落名称的函数一样。