Ich habe ähnliche Fragen und Antworten zu StackOverflow durchgegangen und folgendes gefunden:
%Vor% As, parseInt()
analysiert bis zur ersten Nicht-Ziffer und gibt, was auch immer geparst wurde, zurück und Number()
versucht, die gesamte Zeichenfolge in eine Zahl zu konvertieren, warum unwahrscheinliches Verhalten im Fall von parseInt('')
und Number('')
.
Ich fühle mich ideal% parseInt
sollte NaN
genauso zurückgeben wie Number("123hui")
Nun meine nächste Frage:
As 0 == ''
gibt true
zurück Ich glaube, es interpretiert wie 0 == Number('')
, was wahr ist. Also behandelt der Compiler es wirklich wie 0 == Number('')
und nicht wie 0 == parseInt('')
oder fehle ich einige Punkte?
Die Differenz ist teilweise auf Number()
zurückzuführen, die eine zusätzliche Logik für die Typenkorrektur verwendet. Enthalten in den Regeln, die für folgen das ist:
- Ein StringNumericLiteral , das leer ist oder nur Leerraum enthält, wird in +0 konvertiert.
Während parseInt()
definiert ist, um einfach zu finden und Numerische Zeichen in der Eingabe basierend auf dem angegebenen oder ermittelten radix
auswerten. Und es wurde definiert, um mindestens ein gültiges Zeichen zu erwarten.
13) Wenn S eine Code-Einheit enthält, die keine radix- R Ziffer ist, sei Z die Teilzeichenfolge von S bestehend aus allen Code-Einheiten vor der ersten solchen Code-Einheit; Andernfalls sollte Z S sein.
14) Wenn Z leer ist, geben Sie NaN zurück.
Hinweis: S ist die Eingabezeichenfolge, nachdem ein vorangestelltes Leerzeichen entfernt wurde.
As
0==''
gibttrue
zurück Ich glaube, es interpretiert wie0==Number('')
[...]
Die Regeln, die ==
verwendet, sind definiert als Abstrakte Gleichheit .
Und Sie haben Recht mit der Nötigung / Umwandlung, die verwendet wird. Der relevante Schritt ist # 6:
Wenn Typ ( x ) ist Nummer und Typ ( y ) ist String,
gebe das Ergebnis des Vergleichs zurück x == ToNumber ( y ).
Um Ihre Frage zu 0==''
zu beantworten, geben Sie true zurück:
Unten ist der Vergleich einer Zahl und einer Zeichenfolge:
Der Operator Equals (==)
%Vor%und toNumber tun folgendes für ein string-Argument:
%Vor% Number('')
gibt 0
zurück. Das lässt Sie mit 0==0
stehen, was mit Strict Equality ( ===
) Algorithmus
Der Operator "Strict Equals" (===)
%Vor%Sie können die vollständige Liste @ javascriptweblog.wordpress.com - Wahrheitsgleichheit finden -and-javascript .
parseInt("")
ist NaN
, weil der Standard dies auch dann sagt, wenn +""
stattdessen 0
ist (auch weil der Standard dies sagt, zB "" == 0
).
Suchen Sie nicht nach Logik, denn es gibt keine tiefgründige Logik, nur Geschichte .
Sie machen meiner Meinung nach einen großen Fehler ... je früher Sie es korrigieren, desto besser wird Ihr Programmierleben mit Javascript sein. Der Fehler ist, dass Sie davon ausgehen, dass jede Entscheidung in Programmiersprachen und jedes technische Detail logisch ist. Das ist einfach nicht wahr.
Speziell für Javascript.
Bitte denkt daran, dass Javascript in Eile "entworfen" wurde und nur wegen des Schicksals wurde es über Nacht extrem populär. Dies zwingt die Gemeinschaft, sie zu standardisieren, bevor sie ernsthaft über die Details nachgedacht haben, und deshalb wurde sie in ihrem gegenwärtigen traurigen Zustand vor einer ernsthaften Prüfung auf dem Feld "eingefroren".
Es gibt Teile, die so schlecht sind, dass sie nicht einmal witzig sind (zB with
Statement oder der ==
Gleichheitsoperator, der so kaputt ist, dass seriöse js IDEs vor jedem Gebrauch warnen) : Sie erhalten Dinge wie A==B
, B==C
und A!=C
sogar mit normalen Werten und ohne einen speziellen Wert wie null
, undefined
, NaN
oder leere Strings ""
und nicht wegen Präzisionsproblemen).
Nonsense-Spezialfälle sind überall in Javascript und versuchen, sie in einen logischen Rahmen zu stellen, ist leider eine verschwendete Anstrengung. Lernen Sie seine Besonderheiten kennen, indem Sie viel lesen und sich an der fantastischen Laufzeitumgebung erfreuen (das ist der Punkt, an dem Javascript wirklich glänzt ... Browser und ihr JIT sind ein wirklich beeindruckendes Stück Technologie: Sie können ein paar Zeilen schreiben und echte nützliche Software laufen lassen auf einer Vielzahl von verschiedenen Geräten).
Der offizielle Standard, in dem alle Kuriositäten aufgelistet sind, ist ziemlich schwer zu lesen, weil er sehr genau sein soll, und unglücklicherweise sind die Regeln, die er spezifizieren muss, wirklich komplex.
Außerdem, wenn die Sprache mehr Features bekommt, werden die Regeln immer komplexer. Zum Beispiel, was für ES5 nur ein weiterer seltsamer "spezieller" Fall ist (zB ToPrimitive
Operationsverhalten für Date
Objekte) wird zu einem "normalen" "Fall in ES6 (wobei ToPrimitive
angepasst werden kann).
Nicht sicher, ob diese "Normalisierung" etwas ist, worüber man glücklich sein kann ... das eigentliche Problem ist der eingefrorene Startpunkt und es gibt jetzt keine einfachen Lösungen (wenn man nicht den gesamten vorhandenen JavaScript-Code wegwerfen will) ist).
Der normale Pfad für eine Sprache beginnt sauber und nett und symmetrisch und klein. Dann, wenn man mit Problemen der realen Welt konfrontiert wird, gewinnt die Sprache an einigen hässlichen Stellen (weil die Welt hässlich und asymmetrisch ist) (infiziert).
Javascript ist so. Abgesehen davon, dass es nicht gut und sauber anfing, und außerdem hatte ich keine Zeit, es zu polieren, bevor ich es ins Spiel warf.
Tags und Links javascript