2010-04-15 2 views
8

Dies funktioniert gut:JavaScript 1.6 Array.map() und Array.filter() nicht in Funktionen als Argumente mit eingebautem Arbeits

["655971", "2343", "343"].map(function(x) { return parseInt(x) }) // [655971, 2343, 343] 

Aber dies nicht:

["655971", "2343", "343"].map(parseInt) // [655971, NaN, NaN] 

Das gleiche geschieht für Array.filter()

Was fehlt mir hier?

+0

Falls jemand interessiert ist, diese Situation beschrieben wird, im Detail, auf dem der [MDN 'Array.prototype .map'-Seite] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map#Example:_Tricky_use_case), auf das der folgende Blogpost verweist: [Allen Wirfs -Brock - Eine optionale JavaScript-Argument-Hazard-Funktion (http://www.wirfs-brock.com/allen/posts/166). –

Antwort

20

Es ist, weil map mehr Argumente übergibt als nur das Array-Element in die Callback-Funktion. Sie erhalten:

callback(item, index, array) 

Normalerweise ignoriert Ihre Funktion nur die Argumente, die sie nicht benötigt. Aber parseInt akzeptiert einen optionalen zweiten Parameter:

parseInt(string, base) 

für den ersten Aufruf, base ist die index0. Das funktioniert in Ordnung, weil ECMAScript definiert, dass base=0 dasselbe ist wie das Argument wegzulassen und folglich Dezimal-, Oktal- oder Hexadezimalwerte erlaubt (in diesem Fall dezimal). Für das zweite und dritte Element ist base1 oder 2. Es versucht, die Zahl als Base-1 (die nicht existiert) oder Base-2 (Binär) zu analysieren. Da die erste Zahl in der Zeichenfolge eine Ziffer ist, die in diesen Basen nicht existiert, erhalten Sie eine NaN.

Im Allgemeinen parseInt ohne Boden ist ziemlich sowieso fraglich, so möchten Sie wahrscheinlich:

["655971", "2343", "343"].map(function(x) { return parseInt(x, 10) }) 
+0

Eine andere Möglichkeit (wenn auch mit unterschiedlicher Semantik) ist in einigen Fällen die Verwendung der 'Number' Funktion. Wenn es ohne 'new' aufgerufen wird, konvertiert es sein Argument in eine Zahl, ähnlich dem unären' + 'Operator. –

+0

(Ja ...'Zahl' oder '+' sind gut, obwohl sie nicht sicherstellen, dass es eine ganze Zahl ist.) – bobince

+0

wie würden wir + benutzen? – bucabay

5

Das Problem ist, dass map erwartet, dass die Callback-Funktion sein soll, die drei Argumente akzeptiert, callbackfn(value, index, array). Das zweite Argument kollidiert mit dem Argument der parseInt(string, radix) Funktion.

Karte ruft parseInt wie dies für jedes Element:

parseInt("655971",0); // 655971 
parseInt("2343", 1); // NaN 
parseInt("343", 2); // NaN 

Die erste funktioniert, weil, wenn radix undefiniert oder 0 ist, wird angenommen, 10.

+0

Ich wünschte, ich könnte euch beide die Antwort geben, musste aber die erste wählen. :) – bucabay

Verwandte Themen