Apa yang dilakukan koma dalam ekspresi JavaScript?

89

Jika saya menggunakan:

1.09 * 1; // returns "1.09"

Tetapi jika saya menggunakan:

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

Saya tahu bahwa 1,09 bukanlah angka.

Apa yang dilakukan koma di bagian terakhir kode?

Lebih Banyak Contoh

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
Topera
sumber
1
Saya terkejut bahwa 09 tidak gagal untuk '9' ilegal dalam literal oktal.
rekursif
7
@ recursive - sembarang 9 dalam representasi oktal menghasilkan fallback ke desimal.
Yuval Adam
Jangan bingung dengan koma dalam daftar argumen. alerthanya membutuhkan satu argumen. Apa pun setelah itu akan dibuang.
Andrew
@ Andrew: ya, dibuang oleh alert (), yang hanya membutuhkan satu argumen, tetapi akan dijalankan! Itu aneh. Terima kasih.
Topera
1
@ Topera: tidak terlalu aneh jika Anda memikirkannya dari perspektif JS. Di JS Anda tidak perlu menentukan daftar argumen Anda dalam deklarasi fungsi (Anda bisa menggunakan argumentsobjek sebagai gantinya, yang bisa berapa pun panjangnya). Bahkan dengan JS terkompilasi modern, tidak akan ada cara untuk mengetahui sebelumnya berapa banyak argumen yang akan diambil suatu fungsi. Pertimbangkan ini: function test() { args=[]; for (var i = 0; i < arguments.length; i++) { args.push(arguments[i] + 1); } ;Penerjemah harus tahu bagaimana fungsi itu digunakan untuk mengetahui berapa banyak argumen yang diperlukan. Sebaliknya, ia mengevaluasi segalanya.
Andrew

Jawaban:

95

Operator koma mengevaluasi kedua operannya (dari kiri ke kanan) dan mengembalikan nilai dari operan kedua.

Sumber: https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special_Operators/Comma_Operator

Misalnya, ekspresi 1,2,3,4,5bernilai 5. Jelas sekali, operator koma hanya berguna untuk operasi dengan efek samping.

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

Yuval Adam
sumber
2
Mereka mengambilnya dari C. Saya pikir itu hanya berguna untuk ekspresi yang memiliki efek samping.
Radomir Dopieralski
3
Saya tidak dapat memikirkan banyak kasus di mana operator koma digunakan untuk mempengaruhi apa pun kecuali menyimpan karakter (memperkecil) atau mengaburkan kode.
pengguna17753
1
@ user17753 dapat digunakan secara sah di bagian forloop yang dipisahkan titik koma .
Cyoce
1
@Cyoce: Meskipun itu benar, berbicara secara umum logika seperti itu lebih jelas dilakukan di badan perulangan. Beberapa orang kemudian akan mengklaim bahwa cara mereka memungkinkan beberapa continuepoin tanpa duplikasi, tetapi Anda tidak boleh memiliki banyak continuepoin.
Balapan Ringan di Orbit
@ user17753 Anda mendapatkan uang; mencoba memahami potongan kecil kode minified adalah alasan saya di sini
Jarang 'Where's Monica' Needy
6

Beberapa lagi yang perlu dipertimbangkan:

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

Douglas
sumber
7
Lol, itu menyenangkan:alert("1", alert("2", alert("3")))
Topera
1
@Andrew: Ups, saya telah memperbarui jawaban saya dengan apa yang ingin saya gunakan.
Douglas
Operator koma mengevaluasi setiap operannya (dari kiri ke kanan) dan mengembalikan nilai lastoperan.
xgqfrms
2
Operator koma mengevaluasi kedua operannya (dari kiri ke kanan) dan mengembalikan nilai second operan.

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

Seharusnya seperti ini!

Operator koma mengevaluasi setiap operannya (dari kiri ke kanan) dan mengembalikan nilai lastoperan.

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

xgqfrms.dll
sumber
5
Operator koma membutuhkan dua operan, jadi kutipan asli benar. Apa yang Anda bicarakan adalah hasil akhir dari penyatuan ekspresi seperti itu, tetapi itu berarti kutipan pengganti Anda salah kata. a,b,c,dadalah((((a),b),c),d)
Lightness Races di Orbit
1

Coba lihat di sini - koma adalah singkatan dari beberapa ekspresi / pernyataan. Misalnya dalam kode Anda, Anda dapat menggunakan baris seperti ini:

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

Ini akan mendeklarasikan ketiga variabel tanpa menulis:

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

Semoga membantu.

dhh
sumber
23
Agak tua, tetapi penting untuk diperhatikan: (1) contoh yang Anda berikan tidak menggunakan operator koma ( vardeklarasi tidak menggunakan operator koma , meskipun itu koma) dan (2) Anda tidak dapat memisahkan pernyataan menggunakan operator koma; hanya ekspresi yang diperbolehkan.
Qantas 94 Heavy
0

Menambahkan / memodifikasi properti ke objek dan mengembalikannya di baris yang sama adalah kasus penggunaan yang mungkin:

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]
// }

Fungsi anonim di atas mengembalikan objek dengan nilai acak yang lebih besar dari nilai masukan atau, jika tidak ada, dengan nilai masukan itu sendiri dalam larik yang terdapat dalam biggerproperti.

Ini masih gula sintaksis (seperti fungsi panah ), tetapi itu mempersingkat jumlah baris ... Saya ingin tahu apakah beberapa penambang JS mendeteksi dan menyesuaikan kode dengan cara yang sama secara otomatis. Jalankan di konsol Anda:

((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)
CPHPython
sumber
2
Tapi tentu saja Anda tidak akan memasukkan mantra samar seperti itu ke dalam kode produksi, bukan?
Balapan Ringan di Orbit
@LightnessRacesinOrbit, saya akan mengatakan itu tergantung pada tujuannya (misalnya mengajar, memperpendek kode, tidak ada deklarasi variabel / fungsi, dll.). Jika Anda membuat indentasi seperti yang saya lakukan di atas, ini dapat dibaca dengan sempurna ... Tidak dapat berhenti memperhatikan bahwa Anda menggunakan kata "samar" :)
CPHPython
1
Heh, itu bahkan tidak disengaja 😂
Lightness Races in Orbit