JavaScript ifadelerinde virgül ne işe yarar?


89

Kullanırsam:

1.09 * 1; // returns "1.09"

Ama kullanırsam:

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

1,09'un bir sayı olmadığını biliyorum.

Son kod parçasındaki virgül ne işe yarar?

Daha fazla örnek

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'un sekizlik harflerle yasadışı '9' için başarısız olmamasına şaşırdım.
yinelemeli

7
@ yinelemeli - sekizlik gösterimdeki herhangi bir 9, ondalık sayıya geri dönüşle sonuçlanır.
Yuval Adam

Argüman listesindeki virgülle karıştırmayın. alertsadece bir argüman alır. Bundan sonraki her şey atılır.
Andrew

@Andrew: evet, yalnızca bir argüman alan alert () tarafından atılır, ancak çalıştırılır! Bu tuhaf. Teşekkürler.
Topera

1
@ Topera: JS'nin bakış açısından düşünürseniz gerçekten tuhaf değil. JS'de, işlev bildiriminizde bağımsız değişken listenizi belirtmeniz gerekmez ( argumentsbunun yerine nesneyi kullanabilirsiniz, herhangi bir uzunlukta olabilir). Modern derlenmiş JS ile bile, bir fonksiyonun kaç argüman alacağını önceden söylemenin bir yolu yoktur. Şunu bir düşünün: function test() { args=[]; for (var i = 0; i < arguments.length; i++) { args.push(arguments[i] + 1); } ;Tercümanın, kaç argüman alacağını bilmek için fonksiyonun nasıl kullanıldığını bilmesi gerekir. Bunun yerine her şeyi değerlendirir.
Andrew

Yanıtlar:


95

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

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

Örneğin, ifade olarak 1,2,3,4,5değerlendirilir 5. Açıkçası, virgül operatörü yalnızca yan etkileri olan işlemler için kullanışlıdır.

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


2
C'den aldılar. Bence sadece yan etkileri olan ifadeler için kullanışlı.
Radomir Dopieralski

3
Virgül operatörünün karakterleri kaydetmek (küçültmek) veya kodu karıştırmak dışında herhangi bir etki için kullanıldığı pek çok durum düşünemiyorum.
user17753

1
@ user17753, bir fordöngünün noktalı virgülle ayrılmış bölümünde yasal olarak kullanılabilir .
Cyoce

1
@Cyoce: Bu doğru olsa da, genel olarak bu tür bir mantık döngü gövdesinde daha net bir şekilde gerçekleştirilir. Bazı insanlar daha sonra yollarının continueçoğaltma olmadan birden çok noktaya izin verdiğini iddia edecek , ancak o zaman birden fazla continuenoktaya sahip olmamalısınız .
Yörüngede Hafiflik Yarışları

@ user17753 Para üzerindesiniz; minik bir kod parçacığını anlamaya çalışmak neden buradayım
Nadiren 'Where's Monica' Needy

6

Dikkate alınması gereken bazı şeyler:

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


7
Lol, çok eğlenceli:alert("1", alert("2", alert("3")))
Topera

1
@Andrew: Oops, cevabımı kullanmak istediğim şeyle güncelledim.
Douglas

Virgül operatörü, işlenenlerinin her birini (soldan sağa) değerlendirir ve lastişlenenin değerini döndürür .
xgqfrms

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

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

Böyle olmalı!

Virgül operatörü, işlenenlerinin her birini (soldan sağa) değerlendirir ve lastişlenenin değerini döndürür .

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


5
Virgül operatörü iki işlenen alır , bu nedenle orijinal alıntı doğrudur. Bahsettiğiniz şey, bu tür ifadelerin iç içe geçmesinin nihai sonucudur, ancak bu, değiştirme teklifinizin ince bir şekilde yanlış ifade edildiği anlamına gelir. a,b,c,dis((((a),b),c),d)
Orbit'te Hafiflik Yarışları

1

Buraya bir göz atın - virgül birden çok ifadeyi / ifadeyi temsil eder. Örneğin, kodunuzda şöyle bir satır kullanabilirsiniz:

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

Bu, üç değişkeni de yazmadan bildirir:

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

Umarım yardımcı olur.


23
Biraz eski, ancak dikkat edilmesi gereken önemli: (1) sağladığınız örnekte virgül operatörü kullanılmıyor ( varbildirimler virgül olsa bile virgül operatörünü kullanmıyor ) ve (2) ayıramazsınız virgül operatörlerini kullanan ifadeler; yalnızca ifadelere izin verilir.
Qantas 94 Heavy

0

Bir nesneye özellikler eklemek / değiştirmek ve onu aynı satırda döndürmek olası bir kullanım durumudur:

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

Yukarıdaki anonim işlev, girdi değerinden daha büyük rastgele değerlere sahip bir nesne döndürür veya eğer yoksa, girdi değerinin kendisi biggerözelliğin içerdiği bir dizide bulunur .

Hala sözdizimsel şekerdir ( ok fonksiyonları gibi ), ancak satır sayısını kısaltır ... Bazı JS minifiers kodu otomatik olarak benzer şekilde algılar ve ayarlar mı merak ediyorum. Konsolunuzda çalıştırın:

((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
Ama elbette bu tür şifreli büyüleri üretim koduna koymazsınız, değil mi?
Yörüngede Hafiflik Yarışları

@LightnessRacesinOrbit iyi, amaca bağlı olduğunu söyleyebilirim (örneğin, öğretme, kodu kısaltma, değişken / işlev bildirimi yok, vb.). Yukarıda yaptığım gibi girerseniz, mükemmel bir şekilde okunabilir ... "şifreli" kelimesini kullandığınızı fark etmeden
duramazsınız

1
Heh, bu kasıtlı bile değildi 😂
Yörüngede Hafiflik Yarışları
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.