Последние несколько дней я помогал другу изучать 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, если он действительно один. Кроме того, если вы действительно прочитали это, спасибо.