Что такое оператор <! - в Node.js? - PullRequest
0 голосов
/ 10 января 2019

Я наткнулся на следующий фрагмент Node.js в IRC-комнате для гольфа с кодом, и он меня смущает.

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 # синтаксисе индекса диапазона , и список почти выглядит как Markdown , и это похоже на какое-то странное карри оператора по модулю продолжается.

Однако я бы особенно хотел понять, что происходит с оператором <!--. Первый экземпляр используется в цикле с потенциальным оператором индекса, который выглядит как некий синтаксис итерации диапазона или что-то в этом роде. Но я даже не могу догадаться, что происходит во втором случае.

Что такое оператор <!-- в Node.js и как его использовать?

1 Ответ

0 голосов
/ 10 января 2019

Вот в чем дело ... вы не можете думать , что это 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

Так что здесь происходит? А что там с синтаксисом? Похоже, в конце есть лишние скобки! Кроме того, { } отсутствует, поэтому не следует вызывать вторую строку для каждой итерации! Правильно? Wrong .

Вот как выглядит источник:

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, который потребует закрытия -->. Вместо того, чтобы трактовать это как /*, 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"
    ));

Хм .. Это начинает иметь немного больше смысла. Давайте убьем комментарии и скорректируем новые строки:

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

AHA! Теперь наш бесконечный цикл начинает обретать смысл. Условие завершения цикла всегда оценивает истину:

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

Наш увеличивающийся «оператор» - это лог-сообщение с бессмысленным взятием вместо числа (т. Е. Причина, по которой он печатает NaN):

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

И тело цикла пустое:

for ( ...
    );

Я не уверен, для чего предназначен этот код, но, по крайней мере, вы знаете, почему он делал именно то, что наблюдал, и почему он "работал".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...