Ich habe heute festgestellt, dass Chrome 49 NaN
beim Eingeben {}+{}
in die Konsole nicht mehr ausgegeben wird . Stattdessen wird die Zeichenfolge ausgegeben [object Object][object Object]
.
Warum ist das? Hat sich die Sprache geändert?
javascript
google-chrome
Filip Haglund
quelle
quelle
var e = {}; e.toString()
Sie und Sie werden sehen, was ich meineAntworten:
Chrome devtools packt jetzt automatisch alles, was mit beginnt
{
und endet,}
in ein implizites Klammerpaar ( siehe Code ), um die Auswertung als Ausdruck zu erzwingen. Auf diese Weise wird{}
jetzt ein leeres Objekt erstellt. Sie können dies sehen, wenn Sie den Verlauf ( ↑) durchgehen , in dem die vorherige Zeile enthalten ist(…)
.Warum?
Ich weiß es nicht, aberich könnte vermuten, dass es die Verwirrung für Neulinge verringert, die das Block-gegen-Objekt-Literal-Ding nicht kennen, und es ist auch hilfreicher, wenn Sie nur einen Ausdruck bewerten möchten.Und tatsächlich ist dies die Begründung, wie in Fehler 499864 beschrieben . Komfort pur. Und weil der Knoten REPL es auch hatte ( siehe Code ).
quelle
{a:1}),({b:2}
sollte einen Fehler auslösen, kein Objekt erzeugen.)
falls es sich um einen Kommentar handelt, z. B.{a:3} // :-}
möglicherweise immer noch ein Objekt.Wenn Sie nach dem Überprüfen auf den Aufwärtspfeil klicken, werden Sie feststellen, dass stattdessen der Pfeil nach oben
{} + {}
angezeigt({} + {})
wird"[object Object][object Object]"
.Im Vergleich dazu wird in Firefox
{} + {}
immer noch angezeigtNaN
, aber wenn Sie dies tun, wird({} + {})
es auch angezeigt"[object Object][object Object]"
.Es sieht also so aus, als würde Chrome die umgebende Klammer automatisch hinzufügen, wenn dieser Vorgang angezeigt wird.
quelle
{} + {}
Wenn nicht "bereinigt",({} + {})
wird behandelt,+ {}
weil{}
es als leerer Block analysiert wird.{}
nur ein leerer Codeblock und wird ignoriert, sodass wir+{}
ein unäres+
und ein leeres Objekt haben Initialisierer.+
wird sein Argument in Zahl zwingen, was das Konvertieren des Objekts in ein Grundelement beinhaltet (wastoString
in diesem Fall zu einem führt, was dazu führt"[object Object]"
), und so erhalten wir,+"[object Object]"
was daran liegt,NaN
dass"[object Object]"
es nicht in eine gültige Zahl konvertiert werden kann.Ab Chrome 54 in Bezug auf die Konsole:
Leider habe ich das Clippy-Zitat selbst hinzugefügt. Die Konsole gibt keine Informationen darüber, was sie für Sie getan hat.
Die neuen Regeln sind unglaublich einfach und ersparen uns die Mühe, diese beiden schwierigen Zeichen mühsam einzugeben
o=
oder Objektliterale0,
in die Konsole einzufügen :{
;{wat:1}),({wat:2}
Ist endlich wieder ein Fehler.{let i=0;var increment=_=>i++}
ist endlich richtig erlaubt, was eine ganz nette Art ist, Verschlüsse zu machen.Das Folgende ist jedoch fälschlicherweise ein Objekt. Dies ist genauso praktisch wie von @Bergi erwähnt. Es interpretiert JS falsch, um Ihnen zu helfen! Die Spezifikation besagt, dass es sich um einen Block mit einer beschrifteten Anweisung "foo" mit einem Literal 1 handelt, der nichts zugewiesen ist.
Das obige sollte das gleiche sein wie
Das Folgende wird korrekt als Block behandelt ... weil es einen Kommentar vor sich hat!
Also das ist:
Dies ist ein Objekt:
Dies ist ein Fehler
Also das ist:
Das ist in Ordnung:
undefined
also das ist:
Das nächste wird korrekt als ein Objekt interpretiert, das mit einem in die Ausdrucksposition geschlagen
0,
wird. Auf diese Weise stellen wir im Allgemeinen eindeutig sicher, dass wir einen Ausdruck anstelle einer Anweisung haben.Ich verstehe nicht, warum sie den Wert in Parens einwickeln. JS hat einige lächerliche Designentscheidungen, aber der Versuch, es in dieser einen Situation besser zu machen, ist keine Option. Die Konsole muss JS korrekt ausführen, und wir müssen sicher sein, dass Chrome nicht nur vermutet, dass es uns denkt meinte es wirklich, etwas anderes zu tun.
Wenn Sie keine Kommaoperatoren mögen, können Sie die Zuweisung verwenden
Denn wie es steht
"[object Object][object Object][object Object]"
"NaN[object Object]"
Verrückt und konsequent kann ich damit umgehen ... verrückt und inkonsistent nein danke!
quelle
{foo:1}
und{foo:1}//
produzieren das gleiche. In Chrome JS REPL ist dies nicht der Fall. Die REPL bewertet nicht nur JS. Es geht darum, die Saiten zu verarbeiten und sich für verschiedene Dinge zu entscheiden.var x = eval('{a:1}')
In gültigem JavaScript ist x jetzt 1, nicht das intuitivere Objekt {a: 1}. Ja, das ist komisch, aber Sie können die Sprache nicht einfach ändern, weil sie seltsame Dinge tut. Alles andere als JSON-Zeichenfolgen wird als JavaScript interpretiert und ausgewertet. Das Tippen0,
vor dem Einfügen des JSON ist nicht schwierig. Alternativ würde ich mich über eine Warnung freuen, dass die Zeichenfolge der Einfachheit halber als Objekt anstelle von JavaScript interpretiert wurde.