Virgülle yapılan atama çalışıyor mu?


108

Neden aaa = 1,2,3çalışır ve değerini aaaolarak belirler 1?

Neden çalışmıyor var bbb = 1,2,3?

Neden var bbb = (1,2,3)çalışır ve değerini bbbolarak belirler 3?

Örnek konsol oturumu


9
Sözdizimi hatası alırsınız çünkü değişken adlarının bir sayıyla başlamasına izin verilmez. var a1,a2,a3;basitçe üç yerel değişken bildirecektir.
Jared Farrish

Yanıtlar:


200

Burada çok şey oluyor, ama temelde virgül operatörüne geliyor .

Virgül operatörü her iki işlenenini de (soldan sağa) değerlendirir ve ikinci işlenenin değerini döndürür.


Bu kod:

aaa = 1,2,3

Eşittir:

aaa = 1;
2;
3;

Dolayısıyla aaadolaylı olarak bildirilir ve 1 değeri atanır. Konsoldaki çıktının son ifade olan 3'ün sonucu olduğuna dikkat edin.


Bu kod:

var bbb = 1,2,3

Bu bir sözdizimi hatasıdır çünkü değişken bildirimlerindeki virgüller tek bir satırda birden çok değişkeni bildirmek için kullanılır. MDN makalesinin işaret ettiği gibi,

Virgülle geldiğini hatırlatırız vardeyimi ise değil bir ifadenin içinde var olmadığı için, virgül operatörü. Aksine, varifadelerde birden çok ifadeyi tek bir karakterde birleştirmek özel bir karakterdir .

Dolayısıyla bu kod kabaca şuna eşdeğerdir:

var bbb = 1;
var 2;
var 3;

Tabii ki, 2geçerli bir tanımlayıcı değildir, bu yüzden o noktada başarısız olur.


Bu kod:

var bbb = (1,2,3)

Birincisine çok benzer, ancak sayısal değerler parantez içine alındığı için önce değerlendirilir. Yani bu, genel olarak şuna eşdeğerdir:

1;
2;
var bbb = 3;

17
Daha da, =içinde var bbb = 1;değil aynı =olduğu gibi aaa = 1;- onlar gramer farklı üretimler (AssignmentExpression vs Başlatıcı) gelip sadece aynı belirteci kullanmak olur.
Ryan Cavanaugh

7
Çok güzel bir açıklama. Tamamen açık olmayan şey, a = 1, 2, 3olarak (a = 1), 2, 3değerlendirilen a = 1; 2; 3(ve 3'ü döndüren, örneğin b = (a = 1, 2, 3)3'ten b'ye atanacak) parantez içine alınabilmesiydi . Bunun aksine, olarak a = (1, 2, 3)değerlendirir 1; 2; a = 3ve 3
değerini

MDN değişken atamadaki parenler hakkında ne diyor ve neden tersi?
Brian

@staticx Hiçbir şey 'tersine' yapılmaz. Önce parantezler değerlendirilir. Sahip olduğunuzda olduğu gibi (1 + 2) * 3, 1 + 2ilk önce değerlendirilir ve bu ifadenin sonucu, değerlendirmenin geri kalanı için dış ifadeye geri yerleştirilir.
pswg

9

Virgülün Javascript'te birden çok kullanımı vardır. İfadede:

a = 1, 2, 3;

bu, sağ taraftaki argümanını döndüren bir operatördür. Ama aynı zamanda varbildirimler sözdiziminin de bir parçasıdır , bunlar:

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

(burada [...]bu bölümün isteğe bağlı olduğu anlamına gelir). Sizin varo ayrıştırmak değil bu yüzden beyannamesi, virgül sonrası değişken isimleri eksik. İstediğiniz efekti elde edebilirsiniz:

var a = (1, 2, 3);

Parantezler, virgüllerin değişken bildirimleri arasında sınırlayıcılar yerine işleçler olarak ele alınmasını zorlar.


7

Örneklerinizde virgül iki bağlamda kullanılmaktadır:

var Beyan

İfade sözdizimi varşöyledir:

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

Burada, değişken isim-değer çiftlerini ayırmak için virgül kullanılır. Bir değişken adı bir rakamla başlayamayacağı için aşağıdakiler çalışmayacaktır ( tanımlayıcı adlarına bakın ):

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

Virgül Operatörü

Virgül operatörü her iki işlenenini de (soldan sağa) değerlendirir ve ikinci işlenenin değerini döndürür. Aşağıdaki ifadeler şu şekilde çalışır:

aaa = 1, 2, 3;
  • aaa = 1, 2 2 verir
    • not edin aaa = 1, çünkü =daha yüksek önceliğe sahiptir.,
  • 2, 3 3 verir
var bbb = (1, 2, 3);
  • ifade yukarıda açıklandığı gibi (1, 2, 3)verir3
  • Değişkene bbbdeğer atanır3

2
aaa = 1, 2, 3=> Virgül işlemci aşağıdaki 3 ifadeleri ayırmak için kullanılır: aaa=1, 2ve 3. Virgül operatörünün sonucu, son ifade 3'ün değeridir. Ancak, aaa'ya, OP'nin ekran görüntüsünden açıkça görülebileceği gibi 1 değeri atanır. Bunun nedeni, Virgül Operatörünün en düşük önceliğe sahip olduğu Operatör Önceliğidir.
Tibos

1

İlk durumda:

aaa = 1,2,3

virgül, ifade ayırıcı görevi görür. Bir atama yapar aaa, sonra hesaplar 2ve atar, sonra hesaplar 3ve atar.

Saniyede:

var bbb = 1,2,3

varAnahtar kelime bir sonraki şey JavaScript derleyicisi söyler ,başka değişken adı olmalıdır. Bulamıyor, bu yüzden ölüyor ve tıkanıyor.

var bbb = (1,2,3)

Burada, derleyici önce 1onu değerlendirir ve yok sayar. Sonra değerlendirir 2ve görmezden gelir. Sonra değerlendirir 3ve bu yığında kalır, böylece atanırbbb

İfadeleri ayırmak için virgül kullanmak yaygın olmasa da bazen forgörünüm gibi şeylerde yararlıdır .

for (i = 0, l = 10; i < l; i++) {
  console.log(i);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.