2012-01-26 12 views
22

wtfjs numaralı telefondan, aşağıdakilerin yasal bir javascript olduğunu tespit ettim.Javascript "tuple" notasyonu: amacı nedir?

",,," == Array((null,'cool',false,NaN,4)); // true 

argüman (null,'cool',false,NaN,4) bana bir tuplea gibi görünüyor, ama javascript dizilerini yok!

Javascript konsolumdaki bazı hızlı sınamalar aşağıdakileri verir.

var t = (null,'cool',false,NaN,4); // t = 4 
(null,'cool',false,NaN,4) === 4; // true 
(alert('hello'), 42); // shows the alert and returns 42 

sadece son ifadenin değerini döndürür tabloların noktalı virgül ; ayrılmış listesi gibi aynen çalıştığı görülüyor.

Bu sözdizimini ve semantiklerini açıklayan bir yer var mı? Neden var, yani ne zaman kullanılmalı?

+0

Virüs operatörüdür: http://javascriptweblog.wordpress.com/2011/04/04/the-javascript-comma-operator/ – Lepidosteus

+1

Virgül operatörü ayrıca bir dizi işlevi çalıştırmak için kullanılabilir (ab) Üçlü bir dalın içinde, son ifadenin sonucunu yine de döndüreceği gibi: 'var a = isTrue? (b = f (c), g (b)): (b = g (c), f (b)) '. Nadiren bilge, ancak okunabilirlik üzerinde çok özlü kod tercih edilirse veya hızlı hata ayıklama amaçları için bazen yararlıdır. – Fx32

+0

Bu, JavaScript'te bir 'ifade' olarak adlandırılır; bu, küçük bir rol oynasa da, yalnızca virgül operatörünün bir etkisi değildir; Bu ifade, virgül operatörü nedeniyle çözümlendi. Değerlendirilen herhangi bir ifadenin herhangi bir değişken değişkenine değer atayabilirsiniz. Bu ifade tanımlanmamış olsa bile. – Relic

cevap

30

Sen comma operator etkisini görüyoruz (bu durumda 3) son değeri döndürecektir özünde bu yüzden a = 1, b = 2, c = 3; her ifadeyi çalışacak .

Virgül operatörü, her iki işleneni (soldan sağa) değerlendirir ve ikinci işlenenin değerini döndürür. (Soldan sağa), ancak zincirin tüm ifadeler hala değerlendirilir

a,b,c,...,n her zaman en sağdaki ifadesinin değeri olacaktır değerlendirilir elde edilen değer.

+0

Teşekkürler, 'virgül operatörü' terimi benim aradığım şey. – Grilse

1

Bunu alert((null,'cool',false,NaN,4)) deneyin ve sonra görebilirsiniz. virgül operatörü bütün ifadeleri değerlendirir ve sonuncusu dönmek çünkü

demo

nedenidir.

bu hattın

Think: o istediğinize değişkenleri ayarlamak ve

8

Daha önce açıklandığı gibi, bu davranışa , numaralı operatör neden olmaktadır. Bu nedenle (null,'cool',false,NaN,4) ifadesi her zaman olarak değerlendirilecektir. ayrılan 4 elemanlı yeni bir dizi oluşturur - Yani

",,," == Array(4) 

Array(4) var. Dize ile karşılaştırma sırasında bu dizi Array(4).toString() ile olacak gibi dizeye dönüştürülür. Diziler için toString, bu dizide çağrılan join(',') yöntemi gibi davranır. Dolayısıyla, 4 elemanın boş dizisi için üye ",,," dizgesini oluşturacaktır.