JavaScript式でコンマは何をしますか?


89

私が使用する場合:

1.09 * 1; // returns "1.09"

しかし、私が使用する場合:

1,09 * 1; // returns "9"

1,09は数字ではないことを私は知っています。

コードの最後の部分でコンマは何をしますか?

その他の例

if (0,9) alert("ok"); // alert
if (9,0) alert("ok"); // don't alert

alert(1); alert(2); alert(3); // 3 alerts
alert(1), alert(2), alert(3); // 3 alerts too

alert("2",
    foo = function (param) {
        alert(param)
    },
    foo('1')
)
foo('3'); // alerts 1, 2 and 3

1
09が8進リテラルの違法な「9」で失敗していないことに驚いています。
再帰的

7
@ recursive-8進数表現の9は、10進数にフォールバックします。
のYuvalアダム

引数リストのコンマを混同しないでください。alert引数は1つだけです。それ以降はすべて破棄されます。
アンドリュー

@Andrew:はい、alert()によって破棄されます。これは、引数を1つだけ取りますが、実行されます。それは変だ。ありがとう。
トペラ2010

1
@Topera:JSの観点から考えれば、それほど奇妙なことではありません。JSでは、関数宣言で引数リストを指定する必要はありません(arguments代わりに、任意の長さのオブジェクトを使用できます)。最新のコンパイル済みJSを使用しても、関数が取る引数の数を事前に知る方法はありません。これを考慮してください:function test() { args=[]; for (var i = 0; i < arguments.length; i++) { args.push(arguments[i] + 1); } ;インタプリタは、関数がどのように使用されているかを知って、必要な引数の数を知る必要があります。代わりに、すべてを評価します。
アンドリュー

回答:


95

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

ソース: https //developer.mozilla.org/en/JavaScript/Reference/Operators/Special_Operators/Comma_Operator

たとえば、式はに1,2,3,4,5評価され5ます。明らかに、コンマ演算子は副作用のある操作にのみ役立ちます。

console.log(1,2,3,4,5);
console.log((1,2,3,4,5));


2
彼らはそれをCから取った。それは副作用のある表現にのみ役立つと思う。
Radomir Dopieralski 2010

3
コンマ演算子が、文字の保存(縮小)またはコードの難読化以外に影響を与えるために使用される多くのケースは考えられません。
user17753 2013年

1
@ user17753forループのセミコロンで区切られたセクションで、合法的に使用できます。
Cyoce 2017年

1
@Cyoce:それは本当ですが、一般的に言えば、そのようなロジックはループ本体でより明確に実行されます。何人かの人々は彼らの方法がcontinue重複なしで複数のポイントを可能にすると主張するでしょう、しかしそれならあなたは複数のcontinueポイントを持つべきではありません。
軌道上でのライトネスレース

@ user17753あなたはお金を稼いでいます。縮小されたコードの小さな断片を理解しようとすることが、私がここにいる理由です
めったに 'モニカはどこにあり

6

考慮すべきいくつかのより:

console.log((0, 9));
console.log((9, 0));
console.log(("foo", "bar"));


7
笑、それは楽しいです:alert("1", alert("2", alert("3")))
トペラ2010

1
@Andrew:おっと、私が使用するつもりだったもので私の答えを更新しました。
ダグラス

コンマ演算子は、各オペランドを(左から右に)評価し、lastオペランドの値を返します。
xgqfrms 2017年

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

https://stackoverflow.com/a/3561056/5934465

こんな感じ!

コンマ演算子は、その各オペランドを(左から右に)評価し、lastオペランドの値を返します。

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


5
コンマ演算子は2つのオペランドを取るため、元の引用符は正しかった。あなたが話しているのは、そのような式をネストした結果ですが、それはあなたの置き換えの引用が微妙に間違っていることを意味します。a,b,c,dis((((a),b),c),d)
軌道でのライトネスレース

1

ここを見てください-コンマは複数の式/ステートメントを表します。たとえば、コードでは次のような行を使用できます。

var a=0, b=0, c=0;

これにより、次のように記述せずに3つの変数すべてが宣言されます。

var a=0;
var b=0;
var c=0;

お役に立てば幸いです。


23
少し古いですが、注意することが重要です:(1)提供した例では、コンマ演算子を使用していません(var宣言では、コンマであってもコンマ演算子を使用していません)。(2)分離できません。コンマ演算子を使用したステートメント。式のみが許可されます。
カンタス94ヘビー

0

オブジェクトにプロパティを追加/変更して同じ行に返すことは、考えられるユースケースです。

console.log(
  ((x) => (o = {biggerCond: r => r >= x},
           o.r5 = Array.from(window.crypto.getRandomValues(new Uint16Array(5))),
           o.isAnyBigger = o.r5.some(o.biggerCond),
           o.bigger = o.isAnyBigger ? o.r5.filter(o.biggerCond) : [x], o )
  )(5e4)
);
// Example
// {
//   bigger: [58414, 56500, 63397],
//   isAnyBigger: true,
//   isBiggerCond: r => r >= x,
//   r5: [58414, 12015, 56500, 63397, 43861]
// }

上記の無名関数は、入力値よりも大きいランダムな値を持つオブジェクトを返します。存在しない場合は、biggerプロパティに含まれる配列内の入力値自体を返します。

それはまだ構文糖衣です(矢印関数のように)が、行数を短縮します...一部のJSミニファイアは、同様の方法でコードを自動的に検出して調整するのではないかと思います。コンソールで実行します。

((x)=>(o={biggerCond:r=>r>=x},o.r5=Array.from(window.crypto.getRandomValues(new Uint16Array(5))),o.isAnyBigger=o.r5.some(o.biggerCond),o.bigger=o.isAnyBigger?o.r5.filter(o.biggerCond):[x],o))(5e4)

2
しかしもちろん、あなたはそのような不可解な呪文を本番コードに入れないでしょう?
軌道上でのライトネスレース

@LightnessRacesinOrbitよく、それは目的(例えば、教える、コードを短くする、変数/関数宣言なしなど)に依存すると言います。上記のようにインデントすると、完全に読みやすくなります...「不可解な」という単語を使用したことに気付くのを止められません:)
CPHPython 2018年

1
ええ、それは意図的でもありませんでした😂–
軌道上の
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.