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?
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?
Odpowiedzi:
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, ale domyś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 ).
{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ę.
{} + {}
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 jest toString
w tym przypadku, w wyniku "[object Object]"
), a więc mamy +"[object Object]"
która NaN
dlatego "[object Object]"
nie może być przekształcany do odpowiedniej liczby.
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=
lub 0,
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.
{foo:1}
Powyższe powinno być takie samo jak
if(1) {
foo: 1
}
Poniższy tekst jest poprawnie traktowany jako blok ... ponieważ ma przed sobą komentarz!
//magic comment
{foo:1}
Więc to jest:
{foo:1}
//also magic
To jest obiekt:
{foo:
//not so magic comment
1}
To jest błąd
//not so magic comment
{foo:1}.foo
Więc to jest:
{foo:1}.foo
Jest okej:
1..wat
undefined
więc jest to:
['foo'][0]
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.
0,{foo:1}.foo
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
x = {foo:1}.foo
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ę!
{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. Wpisanie 0,
przed wklejeniem JSON nie jest trudne, alternatywnie byłbym zadowolony z ostrzeżenia, że ciąg został zinterpretowany jako obiekt zamiast JavaScript dla wygody.
var e = {}; e.toString()
a zobaczysz, o co mi chodzi