19

ここ数日、友人が Javascript を学ぶのを手伝っています。数年ぶりの初めての言語で、ほとんど何も覚えていないため、ほぼすべてをゼロから始めています。彼は簡単なチュートリアルを受けており、私は彼が練習できるようにいくつかの演習を提供してきました. 私が彼に与えた最新の演習は、(どうやら) 古典的なFizzBu​​zz 問題でした。彼は少しの助けを借りてそれを解決しましたが、彼は解決策を練りながら非常に興味深いことをしました. 彼は次のコードを思いつきました。

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);
    }
}

彼はブール比較演算子に慣れていなかったので、使用せず&&、代わりにコンマを使用しました。クラッシュして構文エラーについて何か言うだろうと思っていましたが、驚いたことに、正常に実行され、「FizzBu​​zz」や数字のない「Fizz」と「Buzz」の行がたくさん出力されるだけでした。言うまでもなく、私は混乱していたので、少し実験しました。私の最初のテストはこれを実行することでした:

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');

これにより、2行の出力が得られました。

'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 までの奇数であり、最初のテストからの推測を​​裏付けるものでした (コンマ区切りリストの最後のブール値が 1 回おきに反転していたため)。

長い長い文脈の後で、私の質問は次のとおりです。このコンマ構文は、Javascript エンジンの既知の意図的な部分ですか、それともインタープリターの奇妙で見過ごされている癖ですか? コンマが他のいくつかのことに使用できることは知っていますが (1 行で複数の変数を初期化する、配列を宣言する、パラメータを区切るなど)、どの言語でもこのような条件文でコンマが使用されているのを聞いたことがありません。このコードを実行する必要があるかどうかを他の誰かが知っているかどうか、私は興味があります。

参考までに、FizzBu​​zz のコードと 2 番目に実行したテストは両方ともノードを使用して実行され、最初に実行したテストは Chrome の Javascript コンソールで実行されたので、単なるブラウザまたはノード固有の癖ではないようです。本当にそれが1つである場合。あと、本当にここまで読んでくれてありがとう。

4

1 に答える 1

27

コンマは実際の演算子です。両方のオペランドを (左から右に) 評価し、2 番目のオペランドの値を返します。

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

最も一般的な使用法は、forループ内で複数のパラメーターを提供することですが、他の目的にも使用できます。

于 2013-09-05T03:54:21.000 に答える