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ć?
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).
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 ",,,"
.
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)
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