Подтвердить что ты не робот

Являются ли запятые синтаксически действительными в операторах Javascript if?

Последние несколько дней я помогал другу изучать Javascript. Это его первый язык за многие годы, и он почти ничего не помнит, поэтому он начинал почти полностью с нуля. Он проходил простой учебник, и я предоставлял ему некоторые упражнения, чтобы помочь ему тренироваться. Самое последнее упражнение, которое я ему дал, это (по-видимому) классическая проблема FizzBuzz. Он решил это с некоторой помощью, но он делал что-то очень интересное при разработке своего решения. Он придумал следующий код:

for (var x = 1; x <= 100; x++) {
    if (x%3 == 0, x%5 != 0) {
        console.log("Fizz");
    }
    else if (x%3 != 0, x%5 == 0) {
        console.log("Buzz");
    }
    else if (x%3 == 0, x%5 == 0) {
        console.log("FizzBuzz");
    }
    else {
        console.log(x);
    }
}

Он не был знаком с булевыми операторами сравнения, поэтому он не использовал && и вместо этого использовал запятые. Мое предположение состояло в том, что он сработает и скажет что-то о синтаксической ошибке, но, к моему удивлению, он закончил работать отлично и просто распечатал кучу строк "Fizz" и "Buzz" без "FizzBuzz" или цифр. Излишне говорить, что я был в замешательстве, поэтому я немного экспериментировал. Мой первый тест состоял в том, чтобы запустить это:

if (true, true) console.log('true, true');
if (true, false) console.log('true, false');
if (false, true) console.log('false, true');
if (false, false) console.log('false, false');

Который дал мне две строки вывода:

'true, true'
'false, true'

Из этого я сделал предположение, что вся запятая была причиной того, что он не оценивал ничего, кроме последнего выражения в списке. Затем я попытался запустить этот код:

for (var i = 0; i < 16; i++) {
    if ((Math.floor(i / 8) == 1), (Math.floor(i / 4) == 1), (Math.floor(i / 2) == 1), (i % 2 == 1)) {
        console.log(i);
    }
}

На выходе я получил все нечетные числа от 1 до 15, что подтвердило мое предположение из моего первого теста (так как последний логический элемент в списке, разделенном запятыми, переворачивал каждую другую итерацию).

После всего этого долговременного контекста, мой вопрос заключается в следующем: Является ли этот синтаксис запятой известным и преднамеренным элементом механизма Javascript, или это странная, упущенная причуда интерпретатора? Я знаю, что запятые могут использоваться для нескольких других вещей (инициализация нескольких переменных в одной строке, объявление массивов и разделение параметров, которые можно передумать), но я никогда не слышал о том, что они используются в условных выражениях, подобных этому на любом языке, и Мне любопытно, знает ли кто-нибудь еще, должен ли этот код работать даже.

Для справки, код FizzBuzz и второй тест, который я выполнил, были выполнены с помощью node, а первый тест, который я выполнил, был выполнен на консоли Javascript в Chrome, поэтому он не выглядит как браузер, или node -exclusive quirk, если он действительно один. Кроме того, если вы действительно прочитали это, спасибо.

4b9b3361

Ответ 1

Запятая является фактическим оператором. Он оценивает оба своих операнда (слева направо) и возвращает значение второго операнда.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator

Его наиболее распространенное использование заключается в предоставлении нескольких параметров в цикле for, но его также можно использовать для других целей.