2017-09-15 5 views
93

Mit der Chrome-Konsole, das ist meine Ein- und Ausgang:Was macht .map() in dieser Situation?

[0].map(Array); 

[[0, 0, [0]]]; // output 

Was hier geschehen?

EDIT

Der Grund dieser mich neugierig macht, ist, weil so etwas wie

[0].map(String); 

Will return

["0"]; 

Und nicht

["0", "0", "String"] 
+34

annehmen bekommen werde ich anrufen, weil er einige Javascript WTFs um braucht immer glücklich – npst

+12

Oh fühlen, es ist nur ein kleiner wtf-y-Variante von '[‘ 10 ',' 10 ',' 10 ']. Map (parseInt) ' – gronostaj

+2

Noch ein seltsames' .map() 'Verhalten: https://stackoverflow.com/questions/14528397/strange-behavior-for-map-parseint In Generell müssen Sie vorsichtig sein, wenn Sie '.map()' mit Funktionen verwenden, die mehr als ein Argument benötigen. – Barmar

Antwort

122

Die .map() function ruft die Array()-Funktion mit drei Argumenten auf, dem Wert des Array-Elements 0, dem Index dieses Elements, sowie 0 und einem Verweis auf das gesamte Array.

So ist es wie dies zu tun:

var a = [0]; 
var index = 0 
Array(a[index], index, a); // create array with three elements 

Das Array zurück von Array() dann das erste Element des Arrays wird, dass .map() schafft, damit die zusätzliche Ebene der in Ihrem [[0, 0, [0]]] Ergebnis nisten.

EDIT in Bezug auf Ihre edit: wenn Sie [0].map(String); sagen, die mit den gleichen drei Argumente wie String(a[index], index, a), aber die String() Funktion ignoriert alle, aber das erste Argument genannt ergibt String() ist, während Array() alle angegebenen Argumente verwendet.

38

Erstens, Array könnte als eine Funktion verwendet wird Arrays zu erzeugen:

var arr = Array(1, 2, "Hello"); 
 

 
console.log(arr); // [1, 2, "Hello"]

Zweitens, map gibt drei Parameter seinen Rückruf: das Element, dessen Index aus das Array und das Array selbst.

So, da Ihr Array ein Element enthält, die Zeile:

[0].map(Array); 

entspricht:

[Array(0, 0, [0])];  // the element 0 in the original array will be mapped into Array(0, 0, [0]) 
6

Nachdem Sie Frage aktualisiert.Andere Antworten bieten Ihnen Informationen über map

zu beantworten, warum Array und String Konstrukteuren suchen unterscheiden

String Konstruktor akzeptieren 1 Parameter String(thing) während Array new Array(element0, element1[, ...[, elementN]])

+2

Es ist der gleiche Grund, warum '.map (Number)' jedes Element in eine Zahl umwandelt, anstatt etwas wie '[3, 2, [4, 1, 3]]' für jedes Element zurückzugeben. – Xufox

+0

@Xufox ja Antwort ist in Konstruktoren :) –

3

Dieser Aufruf

[0].map(Array); 

gibt Ihnen die Das gleiche Ergebnis, als ob Sie etwas in der Art geschrieben hätten:

[0].map(function (value, index, array) { 
    return Array(value, index, array); 
}) 

Map Funktion ruft Array Funktion mit drei Parametern auf: Wert des Elements, Index des Elements und ganzes Array. Dieser Aufruf an Array gibt Array mit 3 Elementen zurück: Wert (Nummer 0), Index (Nummer 0), ganzes Array ([0]).

Und diese neue Array wird in dem ursprünglichen Array gewickelt, weil Sie Urelement (Nummer 0) auf neues Element (Array aus 3 Elementen) maped

Hinweis: Sie können nur den ersten Parameter zu verwenden verwendet werden, wie in

array.map(function (a) { return a * a; }); 

oder mit zwei gerade auch Index

array.map(function (item, index) { return "index=" + index + ", value=" + item; }); 

Aber erhalten müssen Sie, dass map stil erinnern l stellt 3 Parameter zur Verfügung, die Sie in Ihrer Callback-Funktion ignorieren. Das ist auch der Grund, warum Code wie:

[0].map(String); 

kehrt

["0"] 

Es ist, weil String Funktion Pflege nur über den ersten Parameter und ignoriert andere übergebenen Parameter. Wenn Sie

String(11, "Some", "other", "ignored", "parameters") 

Sie noch

"11"