Aus dem Mozilla Developer Network :
[1,4,9].map(Math.sqrt)
wird ergeben:
[1,2,3]
Warum macht das dann:
['1','2','3'].map(parseInt)
ergeben dies:
[1, NaN, NaN]
Ich habe in Firefox 3.0.1 und Chrome 0.3 getestet und nur als Haftungsausschluss weiß ich, dass dies keine browserübergreifende Funktionalität ist (kein IE).
Ich fand heraus, dass das Folgende den gewünschten Effekt erzielen wird. Es erklärt jedoch immer noch nicht das fehlerhafte Verhalten von parseInt
.
['1','2','3'].map(function(i){return +i;}) // returns [1,2,3]
javascript
Brad
quelle
quelle
.map(parseFloat)
Lazys : Verwenden Sie diese Option, da nur ein Parameter erforderlich ist..map(Number)
.Antworten:
Die Rückruffunktion in
Array.map
hat drei Parameter:Von derselben Mozilla-Seite , auf die Sie verlinkt haben:
Wenn Sie also eine Funktion aufrufen,
parseInt
die tatsächlich zwei Argumente erwartet , ist das zweite Argument der Index des Elements.In diesem Fall haben Sie
parseInt
nacheinander mit Radix 0, 1 und 2 angerufen . Der erste ist derselbe, als würde der Parameter nicht angegeben, daher wird er standardmäßig basierend auf der Eingabe (in diesem Fall Basis 10) verwendet. Basis 1 ist eine unmögliche Zahlenbasis und 3 ist keine gültige Zahl in Basis 2:In diesem Fall benötigen Sie also die Wrapper-Funktion:
oder mit ES2015 + Syntax:
(In beiden Fällen ist es am besten, einen Radix wie gezeigt explizit anzugeben
parseInt
, da er sonst den Radix basierend auf der Eingabe errät. In einigen älteren Browsern führte eine führende 0 dazu, dass er ein Oktal erraten hat, was tendenziell problematisch war rate hex, wenn die Zeichenfolge mit beginnt0x
.)quelle
map
gibt ein zweites Argument weiter, das (in vielen Fällen) denparseInt
Radix-Parameter durcheinander bringt.Wenn Sie einen Unterstrich verwenden, können Sie Folgendes tun:
['10','1','100'].map(_.partial(parseInt, _, 10))
Oder ohne Unterstrich:
['10','1','100'].map(function(x) { return parseInt(x, 10); });
quelle
Sie können dieses Problem mit Number als iteratee-Funktion lösen :
Ohne den neuen Operator kann Number zur Typkonvertierung verwendet werden. Es unterscheidet sich jedoch von parseInt: Es analysiert den String nicht und gibt NaN zurück, wenn die Zahl nicht konvertiert werden kann. Zum Beispiel:
quelle
Ich werde wetten, dass mit dem zweiten Parameter von parseInt, dem Radix, etwas Funky los ist. Warum es mit der Verwendung von Array.map bricht und nicht, wenn Sie es direkt aufrufen, weiß ich nicht.
quelle
Sie können die Pfeilfunktion ES2015 / ES6 verwenden und die Nummer einfach an parseInt übergeben. Der Standardwert für radix ist 10
Oder Sie können Radix explizit angeben, um die Lesbarkeit Ihres Codes zu verbessern.
Im obigen Beispiel wird radix explizit auf 10 gesetzt
quelle
eine andere (funktionierende) schnelle Lösung:
quelle
parseInt
IMHO sollte aus genau diesem Grund vermieden werden. Sie können es einpacken, um es in folgenden Kontexten sicherer zu machen:lodash / fp begrenzt die Argumente standardmäßig auf 1, um diese Fallstricke zu vermeiden. Persönlich habe ich festgestellt, dass diese Problemumgehungen so viele Fehler verursachen, wie sie vermeiden. Die schwarze Liste
parseInt
zugunsten einer sichereren Implementierung ist meines Erachtens ein besserer Ansatz.quelle