2013-09-05 6 views
18

最後の数日、私は友人がJavascriptを学ぶのを手伝ってきました。それは何年もの彼の最初の言語であり、彼は事実上何も覚えていないので、彼はまったく最初から始めています。彼は簡単なチュートリアルを経ていて、私は彼に練習の手助けとなるいくつかの練習を提供してきました。私が彼に与えた最近の練習は、(明らかに)クラシックFizzBuzz problemでした。彼は少しの助けを借りてそれを解決しましたが、彼は自分の解決策を見つけ出す間に何か面白いことをしました。彼は次のコードを思い付いた:カンマはJavascriptのif文で構文的に有効であることを意味していますか?

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"の束を印刷してしまいました。言うまでもなく、私は混乱していたので、少し実験をしました。私は、出力の2つの系統た

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エンジンの既知の意図的な部分ですか、それとも奇妙で見落とされている通訳ですか?コンマは他のいくつかのもの(1行に複数の変数を初期化し、配列を宣言し、パラメータを分離すること)を使用することができますが、どの言語でもこのような条件文で使用されていることは聞いたことがありません。私はこのコードが実行されるべきかどうか誰かが分かっているのか不思議です。

参考までに、FizzBu​​zzコードと2回目のテストはともにノードを使用して実行され、最初のテストはChromeのJavascriptコンソールで実行されていたため、それが実際であればノード排他的なクォークになります。また、実際にこれを読んだら、ありがとう。

+0

他のすべてが失敗した場合、常に[11.14カンマオペレータ(、)](http://www.ecma-international.org/ecma-262/5.1/#sec-11.14) – RobG

+0

カンマ演算子の説明がいくつかありますが、表示されているコードは構文的には有効ですが、FizzBu​​zzの問題は解決していません。 (あるいはそれは有効な解決策への道のりであると言っていたのですか?) – nnnnnn

答えて

26

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

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

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

+2

Huh。どうやら私はグーグルでは悪いですね。私はオペレータとしてそれを見ようとし、完全に失敗しました。早速のお返事ありがとうございます。 – Alex

関連する問題