2013-04-23 10 views
8

Angesichts der folgenden:Array Karte und parseInt woes

> '10.0.0.1'.split('.').map(parseInt) 
[10, NaN, 0, 1] 

Warum ist nicht die Ausgabe statt:

[10, 0, 0, 1] 

Trotz der folgenden halten wahr:

> x = '10.0.0.1'.split('.'); 
["10", "0", "0", "1"] 

> x[1] == x[2] 
true 

Alternativ parseFloat mit gibt mir die gewünschte Ausgabe; aber ich fühle, dass mir hier etwas Entscheidendes fehlt.

EDIT:'10.0.0.1'.split('.').map(function(x) { return parseInt(x); }) funktioniert wie erwartet.

EDIT2: Ich verwende die Chrome-Version 26.0.1410.64, aber das tritt auch in meiner lokalen Kopie von node.js auf.

+1

http://stackoverflow.com/questions/262427/javascript-arraymap-and-parseint http://stackoverflow.com/questions/8594699/map-parseint-strange-results –

Antwort

10

Blick auf die Unterseite dieser Verbindung, bei der "Tricky Use Case", die die Es ist üblich, den Rückruf mit einem Argument zu verwenden (das Element durchquert wird) NaN

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/map

erklärt. Einige Funktionen werden üblicherweise auch mit einem Argument verwendet. Diese Gewohnheiten können zu verwirrendem Verhalten führen.

// Consider: 
["1", "2", "3"].map(parseInt); 
// While one could expect [1, 2, 3] 
// The actual result is [1, NaN, NaN] 

// parseInt is often used with one argument, but takes two. The second being the radix 
// To the callback function, Array.prototype.map passes 3 arguments: the element, the index, the array 
// The third argument is ignored by parseInt, but not the second one, hence the possible confusion. 
// See the blog post for more details 

// Solution: 
function returnInt(element){ 
    return parseInt(element,10); 
} 

["1", "2", "3"].map(returnInt); 
// Actual result is an array of numbers (as expected) [1, 2, 3] 
+0

+1, für Geschwindigkeit und Genauigkeit! –

+0

Danke! Ich wusste, dass es so etwas sein würde, aber war nicht sicher, die Suchkriterien. – dcousens

+0

Große Antwort +1. Das Beispiel, das du gabst, ist genau das, was mich gestoßen hat! Ich habe mich gefragt, warum ich bei Chrome vs Firefox unterschiedliche Ergebnisse erzielt habe, aber das liegt daran, dass das Verhalten, wenn das Radix nicht definiert ist, von der Implementierung abhängig ist. Ich habe jetzt eine breitere Wertschätzung dafür, warum der Mozilla-Doc sagt "definiere immer ein Radix, wenn du" parseInt "verwendest" – xlm