Javascript" krotka " notacja: jaki jest jej sens?

W wtfjs stwierdziłem, że poniżej znajduje się legalny javascript.

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

Argument (null,'cool',false,NaN,4) wygląda jak krotka dla mnie, ale javascript nie ma krotek!

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

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

Wygląda na to, że zachowuje się dokładnie jak oddzielona średnikiem ; lista poleceń, po prostu zwracając wartość ostatniej instrukcji.

Czy jest gdzieś odniesienie, które opisuje tę składnię i jej semantykę? Dlaczego istnieje, czyli kiedy należy go używać?

Author: Grilse, 2012-01-26

3 answers

Widzisz efekt operatora przecinka .

Operator przecinka dokonuje oceny obu swoich operandów (od lewej do prawej) i zwraca wartość drugiego operandu.

Wynikowa wartość, gdy a,b,c,...,n jest obliczana, zawsze będzie wartością wyrażenia po prawej stronie, jednakże wszystkie wyrażenia w łańcuchu są nadal obliczane (od lewej do prawej).

 33
Author: Rich O'Kelly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-26 12:48:51

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

",,," == Array(4)

Array(4) - wytworzy nową tablicę z przydzielonymi 4 elementami. W czasie porównania z łańcuchem ta tablica jest konwertowana na łańcuch, tak jak z Array(4).toString(). Dla tablic toString działa jak metoda join(',') wywołana na tej tablicy. Tak więc dla pustej tablicy 4 elementów join wytworzy łańcuch ",,,".

 8
Author: dfsq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-26 12:57:01

Spróbuj tego alert((null,'cool',false,NaN,4)) a wtedy zobaczysz.

Demo

Powodem jest to, że operator przecinka ocenia wszystkie polecenia i zwraca Ostatnie.

Pomyśl o tej linii: a = 1, b = 2, c = 3; uruchomi każde wyrażenie, więc w istocie ustawi zmienne na to, co chcesz i zwróci ostatnią wartość (w tym przypadku 3)

 1
Author: qwertymk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-26 12:48:14