Apakah tugas dengan koma berfungsi?

108

Mengapa aaa = 1,2,3berhasil dan menetapkan nilai aaamenjadi 1?

Mengapa tidak var bbb = 1,2,3berhasil?

Mengapa var bbb = (1,2,3)berhasil dan menetapkan nilai bbbmenjadi 3?

Contoh sesi konsol

Shankar Cabus
sumber
9
Anda mendapatkan kesalahan sintaks karena nama variabel tidak boleh dimulai dengan angka. var a1,a2,a3;hanya akan mendeklarasikan tiga variabel lokal.
Jared Farrish

Jawaban:

200

Ada banyak hal yang terjadi di sini, tetapi pada dasarnya, ini tergantung pada operator koma .

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


Kode ini:

aaa = 1,2,3

Setara dengan:

aaa = 1;
2;
3;

Jadi aaasecara implisit dideklarasikan dan diberi nilai 1. Perhatikan bahwa output pada konsol adalah hasil dari pernyataan terakhir, 3.


Kode ini:

var bbb = 1,2,3

Merupakan kesalahan sintaks karena koma dalam deklarasi variabel digunakan untuk mendeklarasikan beberapa variabel dalam satu baris. Seperti yang ditunjukkan artikel MDN,

Perhatikan bahwa koma dalam varpernyataan bukanlah operator koma, karena tidak ada dalam ekspresi. Sebaliknya, itu adalah karakter khusus dalam varpernyataan untuk menggabungkan beberapa darinya menjadi satu.

Jadi kode ini kira-kira sama dengan:

var bbb = 1;
var 2;
var 3;

Tentu saja, 2ini bukan pengenal yang valid, jadi gagal pada saat itu.


Kode ini:

var bbb = (1,2,3)

Sangat mirip dengan yang pertama, kecuali karena nilai numerik dibungkus dalam tanda kurung, nilai tersebut dievaluasi terlebih dahulu. Jadi ini secara kasar setara dengan:

1;
2;
var bbb = 3;
pswg
sumber
17
Terlebih lagi, =in var bbb = 1;tidak sama dengan =in aaa = 1;- mereka berasal dari produksi yang berbeda (Initialiser vs AssignmentExpression) dalam tata bahasa dan kebetulan menggunakan token yang sama.
Ryan Cavanaugh
7
Penjelasan yang sangat bagus. Apa yang tidak sepenuhnya eksplisit adalah yang a = 1, 2, 3dapat diberi tanda kurung sebagai (a = 1), 2, 3yang mengevaluasi sebagai a = 1; 2; 3(dan mengembalikan 3, misalnya b = (a = 1, 2, 3)akan menetapkan 3 ke b). Sebaliknya, a = (1, 2, 3)mengevaluasi sebagai 1; 2; a = 3dan mengembalikan 3.
CompuChip
Apa yang dikatakan MDN tentang tanda kurung dalam penugasan variabel dan mengapa sebaliknya? Saya tidak bisa menemukan dokternya
Brian
@staticx Tidak ada yang benar-benar dilakukan 'secara terbalik'. Tanda kurung dievaluasi terlebih dahulu. Sama seperti saat Anda memilikinya (1 + 2) * 3, 1 + 2dievaluasi terlebih dahulu dan hasil dari ekspresi tersebut diganti kembali ke ekspresi luar untuk sisa evaluasi.
pswg
9

Koma memiliki banyak kegunaan dalam Javascript. Dalam ekspresi:

a = 1, 2, 3;

itu adalah operator yang hanya mengembalikan argumen tangan kanannya. Tapi itu juga bagian dari sintaks vardeklarasi, yaitu:

var var1 [ = val1 ], var2 [ = val2 ], var3 [ = val3 ], ...;

(di mana [...]berarti bagian itu opsional). varDeklarasi Anda kehilangan nama variabel setelah koma, jadi tidak dapat diurai. Anda bisa mendapatkan efek yang Anda inginkan dengan:

var a = (1, 2, 3);

Tanda kurung memaksa koma untuk diperlakukan sebagai operator daripada pembatas antara deklarasi variabel.

Barmar
sumber
7

Dalam contoh Anda, koma digunakan dalam dua konteks:

var pernyataan

Sintaks varpernyataannya adalah:

var varname1 [= value1 [, varname2 [, varname3 ... [, varnameN]]]];

Di sini, koma digunakan untuk memisahkan pasangan nama-nilai variabel. Berikut ini tidak akan berfungsi karena nama variabel tidak boleh dimulai dengan digit (lihat nama pengenal ):

var bbb = 1, 2, 3;
// SyntaxError: Unexpected number

Operator Koma

Operator koma mengevaluasi kedua operannya (dari kiri ke kanan) dan mengembalikan nilai dari operan kedua. Ekspresi berikut bekerja sebagai berikut:

aaa = 1, 2, 3;
  • aaa = 1, 2 hasil 2
    • catatan yang aaa = 1dievaluasi terlebih dahulu karena =memiliki prioritas lebih tinggi dari,
  • 2, 3 hasil 3
var bbb = (1, 2, 3);
  • (1, 2, 3)hasil ekspresi 3seperti yang dijelaskan di atas
  • Variabel bbbdiberi nilai3
Salman A
sumber
2
aaa = 1, 2, 3=> Operator koma digunakan untuk memisahkan 3 pernyataan berikut: aaa=1, 2dan 3. Hasil dari operator koma adalah nilai dari pernyataan terakhir 3. Namun, aaa diberi nilai 1, seperti yang dapat dilihat dengan jelas dari tangkapan layar OP. Alasannya adalah Operator Prioritas, dengan Operator Koma memiliki prioritas terendah.
Tibos
1

Dalam kasus pertama:

aaa = 1,2,3

koma berfungsi sebagai pemisah ekspresi. Ia melakukan tugas ke aaa, lalu menghitung 2dan membuangnya, lalu menghitung 3dan membuangnya.

Detik:

var bbb = 1,2,3

Kata varkunci memberitahu compiler Javascript bahwa hal berikutnya setelah a ,harus menjadi nama variabel lain. Itu tidak ditemukan, jadi itu mati dan muntah.

var bbb = (1,2,3)

Di sini, kompilator pertama-tama mengevaluasi 1dan mengabaikannya. Kemudian ia mengevaluasi 2dan mengabaikannya. Kemudian mengevaluasi 3dan yang tersisa di tumpukan sehingga ditugaskan kebbb

Meskipun tidak umum menggunakan koma untuk memisahkan ekspresi, ini terkadang berguna dalam hal-hal seperti forpenampilan.

for (i = 0, l = 10; i < l; i++) {
  console.log(i);
}
Jeremy J Starcher
sumber