【问题标题】:What is the <!--​ operator in Node.js?Node.js 中的 <!--​ 运算符是什么?
【发布时间】:2019-01-10 15:19:12
【问题描述】:

我在代码高尔夫 IRC 房间里遇到了以下 Node.js sn-p,这让我很困惑。

for (let x = 100; 1^ <!-- x; x++)
    console.log(`${x} bottles of beer on the wall.`);
    console.log("The beer goes", x - <!-- (3, 5) % (
        - "outputs"
        * "fizz"
        * "buzz"
        * "fizzbuzz"
    ));

代码似乎不正确 -- 当我尝试在 Node 中运行它时,我得到一个无限循环。但令我惊讶的是,它确实可以编译并运行!

它似乎使用了我以前从未见过的几个功能。它的^1的使用让我想起了即将到来的C# range index syntax,而且这个列表几乎看起来像Markdown,看起来模数运算符的某种奇怪的currying正在进行中。

但是,我特别想了解 &lt;!-- 运算符的情况。第一个实例在循环中使用,带有潜在的索引运算符,这看起来像是某种范围迭代语法或其他东西。但我什至无法猜测第二次发生了什么。

Node.js 中的&lt;!-- 运算符是什么,应该如何使用?

【问题讨论】:

    标签: javascript node.js loops range operators


    【解决方案1】:

    事情是这样的......你可能不会认为它是 HTML,但这就是语法的来源。

    我将该代码完全放入名为test.js 的文件中,然后是node test.js

    100 bottles of beer on the wall.
    The beer goes NaN
    100 bottles of beer on the wall.
    The beer goes NaN
    100 bottles of beer on the wall.
    The beer goes NaN
    --- ad infinitum
    

    那么这里发生了什么?语法是什么?好像最后多了一个括号!此外,没有{ },因此不应每次迭代都调用第二行!对? 错误

    源代码如下:

    for (let x = 100; 1^ <!-- x; x++)
        console.log(`${x} bottles of beer on the wall.`);
        console.log("The beer goes", x - <!-- (3, 5) % (
            - "outputs"
            * "fizz"
            * "buzz"
            * "fizzbuzz"
        ));
    

    现在,这不是 HTML 中需要关闭 --&gt;&lt;!-- 评论开启器。相反,JavaScript 不像 /* 那样对待它,而是像 // 那样使用它们:它们注释该行的其余部分。

    for (let x = 100; 1^ // x; x++)
        console.log(`${x} bottles of beer on the wall.`);
        console.log("The beer goes", x - // (3, 5) % (
            - "outputs"
            * "fizz"
            * "buzz"
            * "fizzbuzz"
        ));
    

    嗯.. 这开始变得更有意义了。让我们杀死 cmets 并调整换行符:

    for (let x = 100;
         1^ console.log(`${x} bottles of beer on the wall.`);
         console.log("The beer goes", x - - "outputs" * "fizz" * "buzz" * "fizzbuzz")
        );
    

    啊哈!现在我们的无限循环开始变得有意义了。循环的终止条件总是评估为真:

    1^ console.log(`${x} bottles of beer on the wall.`);
    

    我们递增的“运算符”是一条带有废话而不是数字的日志消息(即它打印NaN的原因):

    console.log("The beer goes", x - - "outputs" * "fizz" * "buzz" * "fizzbuzz")
    

    而循环体是空的:

    for ( ...
        );
    

    我不确定这段代码的目的是什么,但至少你知道它为什么完全按照你观察到的那样做以及为什么它“有效”。

    【讨论】:

    • 此代码令人憎恶。我们应该用火杀死它。
    • @RobertHarvey 这是代码高尔夫,所以可憎的东西是球场的标准。 双关语
    • 我不知道该说什么,但你应该看看这个:imgur.com/OE43biX
    • @mwoa 您可能有兴趣了解caret operator。它与我们在这里看到的没有直接关系,但在这种情况下,console.log 调用被评估为undefined1^undefined === 1,这是真的。
    • 我开始觉得不那么傻了,但这可能还需要几天时间。很好的解释,非常感谢。
    猜你喜欢
    • 2012-05-11
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 2021-12-04
    • 2021-10-28
    • 2021-02-13
    • 2012-11-21
    相关资源
    最近更新 更多