JavaScript中的`_|_`是什么?

5

我在查找一个解决JavaScript问题的方案,即将字符串解析为其组成的名称、运算符和括号时,看到了这个表达式:

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

那个_|_是什么?它使用了node的_功能吗?我已经查找了文档但没有找到。

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

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

需要澄清的是,在代码中未定义变量_

该代码在Node v8.1.3上运行良好,但在Chrome本地浏览器JS上也可以正常工作。

这是代码:

function tokenise(string) {
  const tokens = string.match( /[a-z]+|\(|\)|[!#$%&*+\-\/<=>@^_.,;]+/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; }
}
3个回答

9

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

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

这是使用node的_功能吗?

_在Node代码中并不特殊。在REPL中(仅限于REPL),它是接收最近评估表达式结果的变量;详细信息请参见此处

作为澄清,代码中未定义变量_

这意味着,如果accept(")")返回真值,代码将抛出ReferenceError,因为_是未声明的标识符。如果作者的意图是这样,那么根本不需要|运算符,但在一个现已删除的答案中,georg指出他们可能使用_|_来表达数学概念的底部(一个永远不会成功完成的计算),其符号为。在任何情况下,作者似乎都将其用于在表达式上下文中强制引发异常(因为throw是一个语句;虽然有可能允许在某个时候在表达式上下文中使用它)。


@Xufox:嗯,太糟糕了。我已经添加了他指出的要点。 - T.J. Crowder

4

它接受一个变量_并使用自身的按位或|运算。

结果得到一个32位整数。


1
代码中没有给_赋值,这就是为什么它很困惑的原因。 - AJF

0
除了已经在这里详细解释的内容之外,你的代码是相当普通的JavaScript,没有什么特别的地方...
我曾经在多种编程语言中遇到过类似的代码,当语法冗长用于生成看似有趣的表达式时,就会产生类似文本艺术(也称为ASCII艺术)的效果。虽然这样做会让代码看起来很奇怪,但它们也是100%有效的代码。
你的代码示例让人想起那些愚蠢的笑话,就像有人用一个段落长的名称来介绍一个函数一样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接