2013-09-05 12 views
18

Son birkaç gün, bir arkadaşım Javascript öğrenmesine yardımcı oldum. Yıllar içinde ilk dili ve neredeyse hiçbir şeyi hatırlamıyor, bu yüzden neredeyse tamamen sıfırdan başlıyor. Basit bir öğreticiden geçiyor ve ona pratik yapması için bazı alıştırmalar yapıyordum. Ona verdiğim en son egzersiz (görünüşte) klasik FizzBuzz problem idi. Biraz yardımla çözdü, ama çözümünü çalışırken çok ilginç bir şey yaptı.İfadeler, virgüllerin Javascript'te sözdizimsel olarak geçerli olması anlamına mı geliyor?

for (var x = 1; x <= 100; x++) { 
    if (x%3 == 0, x%5 != 0) { 
     console.log("Fizz"); 
    } 
    else if (x%3 != 0, x%5 == 0) { 
     console.log("Buzz"); 
    } 
    else if (x%3 == 0, x%5 == 0) { 
     console.log("FizzBuzz"); 
    } 
    else { 
     console.log(x); 
    } 
} 

O boolean karşılaştırma operatörleri ile tanıdık değildi, bu yüzden && ve bunun yerine kullanılan virgül kullanmayın vermedi: O aşağıdaki kodla geldi. Benim beklentim çökecek ve bir sözdizimi hatası hakkında bir şey söyleyecekti, ama benim sürpriz için iyi çalışıyor ve sadece bir "Fizz" ve "Buzz" satırları, hiçbir "FizzBuzz" veya sayılarla yazdırmak sona erdi. Söylemeye gerek yok, kafam karıştı, bu yüzden biraz deneme yaptım. Bana çıktı iki satır verdi

if (true, true) console.log('true, true'); 
if (true, false) console.log('true, false'); 
if (false, true) console.log('false, true'); 
if (false, false) console.log('false, false'); 

: Bu itibaren

'true, true' 
'false, true' 

, bunun son başka bir şey değerlendirmek için neden yaptığını virgül bütün olduğunu tahmin yaptı Benim ilk test bu çalışmasına oldu Listede ifade. Sonra bu kodu kullanmayı denedim:

for (var i = 0; i < 16; i++) { 
    if ((Math.floor(i/8) == 1), (Math.floor(i/4) == 1), (Math.floor(i/2) == 1), (i % 2 == 1)) { 
     console.log(i); 
    } 
} 

Ben virgülle ayrılmış listedeki son boolean her saygısız beri (ilk testinden Tahminimde doğruladı 1-15, tüm tek sayılar oldu got çıktı diğer iterasyon).

Tüm bu uzun soluklu içerikten sonra, sorum şu: Bu virgül, Javascript motorunun bilinen ve kasıtlı bir parçası mıdır, yoksa tercümanın garip, gözden kaçırılmış bir tuhaflığı mıdır? Virgüllerin birkaç şey için kullanılabileceğini biliyorum (tek bir satırda birden çok değişken başlatabilir, dizileri belirtebilir ve parametrelerin aklına sıçramasını engelleyebilir), fakat bunların hiç bir dilde koşullu ifadelerde kullanıldığını hiç duymadım ve Bu kodun çalıştırılıp çalıştırılmayacağını bilen başka birinin olup olmadığını merak ediyorum.

Başvuru için, FizzBuzz kodu ve çalıştırdığım ikinci testin ikisi de düğüm kullanılarak gerçekleştirildi ve çalıştırdığım ilk test Chrome'daki Javascript konsolunda yapıldı, bu yüzden yalnızca bir tarayıcı gibi görünmüyor. ya da gerçekten bir tane ise, node özel tuhaflık. Ayrıca, bunu gerçekten okuduysanız, teşekkür ederim.

+0

Her şey başarısız olduğunda, her zaman belirtim vardır: [11.14 Comma Operator (,)] (http://www.ecma-international.org/ecma-262/5.1/#sec-11.14) – RobG

+0

Şimdi virgül operatörünün bazı açıklamaları var, gösterilen kodun sözdizimsel olarak geçerli olduğunu ancak FizzBuzz sorununu çözmediğini unutmayın. (Ya da geçerli bir çözüm yolunda sadece bir adım olduğunu mu söylüyordun?) – nnnnnn

cevap

26

Virgül, gerçek bir işleçtir. Her iki işleneni de (soldan sağa) değerlendirir ve ikinci işlenenin değerini döndürür.

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

Onun en yaygın kullanımı bir for döngü içinde birden çok parametre temin etmektir, ama aynı zamanda başka amaçlar için de kullanılabilir.

+2

Huh. Görünüşe göre googling'de kötüyüm o zaman. Bir operatör olarak bakmaya çalıştım ve tamamen başarısız oldu. Hızlı cevap için teşekkürler. – Alex