Okay, also habe ich mit parseInt herumgespielt, um zu sehen, wie es mit Werten umgeht, die noch nicht initialisiert wurden, und bin auf dieses Juwel gestoßen. Das Folgende passiert für jeden Radix 24 oder höher.
parseInt(null, 24) === 23 // evaluates to true
Ich habe es in IE, Chrome und Firefox getestet und alle alarmieren true, daher denke ich, dass es irgendwo in der Spezifikation enthalten sein muss. Eine schnelle Google-Suche hat mir keine Ergebnisse gebracht, also bin ich hier und hoffe, dass jemand es erklären kann.
Ich erinnere mich an eine Crockford-Rede, in der er typeof null === "object"
wegen eines Versehens sagte, dass Object und Null eine nahezu identische Typkennung im Speicher haben oder so ähnlich, aber ich kann das Video jetzt nicht finden.
Probieren Sie es aus: http://jsfiddle.net/robert/txjwP/
Korrektur bearbeiten : Ein höherer Radix gibt unterschiedliche Ergebnisse zurück, 32 gibt 785077 zurück.
Bearbeiten 2 Von zzzzBov:[24...30]:23, 31:714695, 32:785077, 33:859935, 34:939407, 35:1023631, 36:1112745
tl; dr
Erklären Sie, warum dies parseInt(null, 24) === 23
eine wahre Aussage ist.
quelle
alert(parseInt(null, 34) === 23)
produziertfalse
alert(parseInt(null,26)===23);
produziert auch wahr?!?![24...30]:23
,31:714695
,32:785077
,33:859935
,34:939407
,35:1023631
,36:1112745
,[37...]:NaN
undefined
da der erste Parameter ungerade Ergebnisse für dieAntworten:
Es wird
null
in den String"null"
konvertiert und versucht, ihn zu konvertieren. Für die Radixe 0 bis 23 gibt es keine Ziffern, die konvertiert werden können, daher wird zurückgegebenNaN
. Bei 24 wird"n"
der 14. Buchstabe zum Zahlensystem hinzugefügt. Bei 31 wird"u"
der 21. Buchstabe hinzugefügt und die gesamte Zeichenfolge kann dekodiert werden. Ab 37 kann kein gültiger Zahlensatz mehr generiert werden und NaN wird zurückgegeben.quelle
toString()
?Mozilla sagt uns :
In der Spezifikation sagt uns 15.1.2.2/1, dass die Konvertierung in einen String mit dem eingebauten System durchgeführt wird
ToString
, das (gemäß 9.8) ergibt"null"
(nicht zu verwechseln mit demtoString
, was ergeben würde"[object Window]"
!).Also, lasst uns überlegen
parseInt("null", 24)
.Natürlich ist dies keine vollständige numerische Zeichenfolge der Basis 24, aber "n" ist: Es ist eine Dezimalzahl 23 .
Jetzt wird die Analyse beendet, nachdem die Dezimalstelle 23 herausgezogen wurde, da sie im Basis-24-System
"u"
nicht gefunden wird:(Und aus diesem Grund
parseInt(null, 23)
(und mit niedrigeren Radices) erhalten SieNaN
eher als 23:"n"
befindet sich nicht im Basis-23-System.)quelle
Ignacio Vazquez-Abrams ist richtig, aber lassen Sie uns genau sehen, wie es funktioniert ...
Von
15.1.2.2 parseInt (string , radix)
:Hier gibt es zwei wichtige Teile. Ich habe beide gewagt. Also müssen wir zuerst herausfinden, was die
toString
Darstellung vonnull
ist. Wir müssenTable 13 — ToString Conversions
in Abschnitt 9.8.0 nach diesen Informationen suchen :Großartig, jetzt wissen wir also, dass
toString(null)
internes Handeln eine'null'
Zeichenfolge ergibt . Großartig, aber wie genau werden Ziffern (Zeichen) behandelt, die innerhalb des angegebenen Radix nicht gültig sind?Wir schauen nach oben
15.1.2.2
und sehen die folgende Bemerkung:Das bedeutet, dass wir alle Ziffern VOR dem angegebenen Radix behandeln und alles andere ignorieren.
Im Grunde ist das Tun
parseInt(null, 23)
dasselbe wieparseInt('null', 23)
. Diesu
bewirkt, dass die beidenl
ignoriert werden (obwohl sie Teil des Radix 23 sind). Daher können wir nur analysierenn
, was die gesamte Aussage synonym machtparseInt('n', 23)
. :) :)Wie auch immer, tolle Frage!
quelle
Ist äquivalent zu
das ist äquivalent zu
Die Ziffern für die Basis 24 sind 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, ..., n.
Die Sprachspezifikation sagt
Dies ist der Teil, der sicherstellt, dass Ganzzahlliterale im C-Stil wie
15L
richtig analysiert werden"n"
ist der 23. Buchstabe der obigen Ziffernliste.QED
quelle
Ich denke,
null
wird in eine Zeichenfolge konvertiert"null"
. Ist alson
tatsächlich23
in 'base24' (dasselbe in 'base25' +),u
ist in 'base24' ungültig, so dass der Rest der Zeichenfolgenull
ignoriert wird. Aus diesem Grund wird ausgegeben,23
bisu
es in 'base31' gültig wird.quelle
parseInt verwendet eine alphanumerische Darstellung, dann ist in Basis-24 "n" gültig, aber "u" ist ein ungültiges Zeichen, dann analysiert parseInt nur den Wert "n" ....
Versuchen Sie als Beispiel Folgendes:
Das Ergebnis ist "3".
quelle