Zauważyłem dzisiaj, że Chrome 49 nie wyświetla już wyjścia NaN
podczas wpisywania {}+{}
w konsoli. Zamiast tego wyprowadza ciąg [object Object][object Object]
.
Dlaczego to? Czy zmienił się język?
javascript
google-chrome
Filip Haglund
źródło
źródło
var e = {}; e.toString()
a zobaczysz, o co mi chodziOdpowiedzi:
Chrome devtools teraz automatycznie zawija wszystko, co zaczyna się od
{
i kończy}
w niejawnej parze nawiasów ( patrz kod ), aby wymusić jego ocenę jako wyrażenie. W ten sposób{}
tworzy teraz pusty obiekt. Możesz to zobaczyć, jeśli wrócisz do historii ( ↑), poprzednia linia będzie zawarta w(…)
.Czemu?
Nie wiem, aledomyślam się, że zmniejsza to zamieszanie u początkujących, którzy nie wiedzą o dosłowności blok kontra obiekt, a także jest bardziej pomocne, jeśli chcesz po prostu ocenić wyrażenie.I faktycznie to jest rozumowanie, jak omówiono w błędzie 499864 . Czysta wygoda. A ponieważ węzeł REPL również to miał ( patrz kod ).
źródło
{a:1}),({b:2}
powinien generować błąd, a nie tworzyć obiektu.)
na wypadek, gdyby był w komentarzu, np.{a:3} // :-}
Nadal może tworzyć obiekt.Jeśli po sprawdzeniu tego naciśniesz strzałkę w górę, zauważysz, że zamiast
{} + {}
tego wyświetla się({} + {})
, co powoduje"[object Object][object Object]"
.Dla porównania, w Firefoksie
{} + {}
nadal wyświetla sięNaN
, ale jeśli to zrobisz({} + {})
, również wyświetla"[object Object][object Object]"
.Wygląda więc na to, że Chrome automatycznie dodaje otaczający nawias, gdy widzi tę operację.
źródło
{} + {}
gdy nie jest „oczyszczony”,({} + {})
jest traktowany jako+ {}
ponieważ{}
jest analizowany jako pusty blok.{}
jest tylko pustym blokiem kodu i jest ignorowany, pozostawiając nas+{}
, który jest jednoargumentowym+
i pustym obiektem inicjator.+
będzie zmuszania jej argumentu numeru, który polega na przekształceniu obiektu na pierwotną (która w końcu jesttoString
w tym przypadku, w wyniku"[object Object]"
), a więc mamy+"[object Object]"
któraNaN
dlatego"[object Object]"
nie może być przekształcany do odpowiedniej liczby.Od Chrome 54 w odniesieniu do konsoli:
Niestety sam dodałem cytat Clippy. Konsola nie podaje żadnych informacji o tym, co dla Ciebie zrobiła.
Nowe zasady są niewiarygodnie proste , dzięki czemu nie musimy mozolnie wpisywać tych 2 trudnych znaków
o=
lub0,
przed wklejeniem literali obiektu do konsoli:{
;{wat:1}),({wat:2}
To w końcu znowu błąd.{let i=0;var increment=_=>i++}
w końcu jest poprawnie dozwolone, co jest całkiem niezłym sposobem na zamykanie.Jednak poniższy obiekt jest niepoprawny, jest to tylko wygoda, o której wspomniał @Bergi, interpretuje JS źle, aby ci pomóc! Specyfikacja mówi, że jest to blok z oznaczoną instrukcją „foo” z literałem 1, który nie jest do niczego przypisany.
Powyższe powinno być takie samo jak
Poniższy tekst jest poprawnie traktowany jako blok ... ponieważ ma przed sobą komentarz!
Więc to jest:
To jest obiekt:
To jest błąd
Więc to jest:
Jest okej:
undefined
więc jest to:
Następny jest poprawnie zinterpretowany jako obiekt wbity w pozycję wyrażenia za pomocą a,
0,
co generalnie jest sposobem, w jaki jednoznacznie upewniamy się, że zamiast instrukcji mamy wyrażenie.Nie rozumiem, dlaczego zawijają wartość w pareny. JS ma kilka absurdalnych decyzji projektowych, ale próba sprawienia, by zachowywał się lepiej w tej jednej sytuacji, tak naprawdę nie wchodzi w grę, konsola musi poprawnie uruchamiać JS i musimy być pewni, że chrome nie tylko zgaduje, że myśli, że my naprawdę chciał zrobić coś innego.
Jeśli nie lubisz operatorów przecinkowych, możesz użyć przypisania
Ponieważ w obecnej postaci
"[object Object][object Object][object Object]"
"NaN[object Object]"
Szalony i konsekwentny, z którym mogę sobie poradzić ... szalony i niekonsekwentny nie, dziękuję!
źródło
{foo:1}
i{foo:1}//
produkuj to samo. W Chrome JS REPL tego nie robią. REPL robi coś więcej niż tylko ocenę JS. Przetwarza struny i decyduje się na różne rzeczy.var x = eval('{a:1}')
W prawidłowym JavaScript x jest teraz 1, a nie bardziej intuicyjnym obiektem {a: 1}. Tak, to dziwne, ale nie możesz tak po prostu zmienić języka, ponieważ robi on dziwne rzeczy. Wszystko inne niż ciągi JSON jest interpretowane jako JavaScript i oceniane. Wpisanie0,
przed wklejeniem JSON nie jest trudne, alternatywnie byłbym zadowolony z ostrzeżenia, że ciąg został zinterpretowany jako obiekt zamiast JavaScript dla wygody.