2012-01-26 14 views
22

Na wtfjs, stwierdziłem, że następujące jest prawnym javascript.JavaScript "krotek" notacja: jaki jest jej sens?

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

Argument (null,'cool',false,NaN,4) wygląda krotki do mnie, ale JavaScript nie ma krotki!

Niektóre szybkie testy w mojej konsoli javascript dają następujące wyniki.

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 

Wydaje się zachowywać dokładnie tak jak średnik ; oddzielone listy stwierdzeń, po prostu zwrotu wartości ostatniego sprawozdania.

Czy istnieje odniesienie, które opisuje tę składnię i jej semantykę? Dlaczego on istnieje, tj. Kiedy powinien być używany?

+0

Jest to operator przecinka: http://javascriptweblog.wordpress.com/2011/04/04/the-javascript-comma-operator/ – Lepidosteus

+1

Operator przecinka może być również (ab) używany do uruchamiania szeregu funkcji wewnątrz gałęzi potrójnej, ponieważ i tak zwróci wynik ostatniej instrukcji: 'var a = isTrue? (b = f (c), g (b)): (b = g (c), f (b)) ". Rzadko jest to mądre, ale czasem przydatne, gdy bardzo zwięzły kod jest preferowany w stosunku do czytelności lub do celów szybkiego debugowania. – Fx32

+0

To się nazywa "wyrażenie" w JavaScript, to nie jest po prostu efekt operatora przecinka, chociaż odgrywa niewielką rolę; To wyrażenie zostało rozstrzygnięte z powodu operatora przecinka. Możesz ustawić wartość dowolnej zmiennej zmiennej dowolnego ocenianego wyrażenia. Nawet jeśli to wyrażenie jest niezdefiniowane. – Relic

Odpowiedz

30

Widzisz efekt comma operator .

Operator przecinek ocenia jego obu argumentów (od lewej do prawej) i zwraca wartość drugiego operandu.

Wartość Otrzymany po a,b,c,...,n oceniano zawsze jest wartością najbardziej na prawo Jednakże wyrażenie wszystkie wyrażeń w sieci nadal ocenia (od lewej do prawej).

+0

Dzięki termin „operator przecinek” jest to, czego szukasz. – Grilse

1

Spróbuj tego alert((null,'cool',false,NaN,4)), a następnie możesz zobaczyć.

demo

Powodem jest fakt, że operator przecinka ocenia wszystkie oświadczenia i powrócić ostatni.

myśleć o tym wierszu: a = 1, b = 2, c = 3; będzie działać każdy wyraz tak w istocie będzie to zestaw zmiennych, co chcesz i zwróci ostatnią wartość (w tym przypadku 3)

8

Jak już wyjaśniono, to zachowanie jest spowodowane przez operatora ,. Z tego powodu wyrażenie (null,'cool',false,NaN,4) zawsze będzie oceniać jako 4. Tak więc mamy

Array(4) - tworzy nową tablicę z przydzielonymi 4 elementami. W czasie porównania z ciągiem ta tablica jest konwertowana na ciąg znaków, tak jak byłoby to z Array(4).toString(). Dla tablic toString działa taka metoda, jak wywoływana w tej tablicy. Tak więc dla pustej tablicy 4 elementów sprzężenie wygeneruje ciąg znaków ",,,".