Website-Suche

Arrays - Warum ist [1,2] + [3,4]="1,23,4" in JavaScript?


Ich wollte die Elemente eines Arrays zu einem anderen hinzufügen, also habe ich Folgendes versucht:

[1,2] + [3,4]

Es antwortete mit:

"1,23,4"

Was passiert?

Antwort #1

Der +-Operator ist für Arrays nicht definiert.

Was passiert, ist, dass Javascript Arrays in Zeichenketten umwandelt und diese dann zusammenfügt.

Aktualisieren

Da diese Frage und folglich meine Antwort viel Aufmerksamkeit bekommt, hielt ich es für nützlich und relevant, auch einen Überblick darüber zu geben, wie der +-Operator im Allgemeinen funktioniert.

Also, hier geht es los.

Abgesehen von E4X und implementierungsspezifischen Dingen hat Javascript (ab ES5) 6 eingebaute Datentypen:

  1. Undefiniert
  2. Null
  3. Boolesch
  4. Nummer
  5. String
  6. Objekt

Beachten Sie, dass typeof zwar etwas verwirrend object für Null und function für aufrufbare Objekte zurückgibt, Null jedoch tatsächlich kein Objekt ist und streng genommen in spezifikationskonformen Javascript-Implementierungen alle Funktionen als Objekte betrachtet werden.

Genau - Javascript hat keine primitiven Arrays an sich; nur Instanzen eines Objekts namens Array mit etwas syntaktischem Zucker, um den Aufwand zu erleichtern.

Um die Verwirrung noch zu vergrößern, sind Wrapper-Entitäten wie new Number(5), new Boolean(true) und new String("abc") alle vom Typ object, nicht wie man erwarten könnte Zahlen, Booleans oder Strings. Dennoch verhalten sich Number und Boolean bei arithmetischen Operatoren wie Zahlen.

Einfach, oder? Damit wäre das geklärt, können wir uns nun dem Überblick selbst zuwenden.

Verschiedene Ergebnistypen von + nach Operandtypen

            || undefined | null   | boolean | number | string | object |
=========================================================================
 undefined  || number    | number | number  | number | string | string | 
 null       || number    | number | number  | number | string | string | 
 boolean    || number    | number | number  | number | string | string | 
 number     || number    | number | number  | number | string | string | 
 string     || string    | string | string  | string | string | string | 
 object     || string    | string | string  | string | string | string | 

* gilt für Chrome13, FF6, Opera11 und IE9. Die Überprüfung anderer Browser und Versionen bleibt dem Leser überlassen.

Hinweis: Wie von CMS hervorgehoben, erzeugt der +-Operator bei bestimmten Objekten wie Number, Boolean und benutzerdefinierten Objekten nicht unbedingt ein String-Ergebnis. Dies kann je nach Implementierung der Umwandlung von Objekt in primitiven Wert variieren. Zum Beispiel erzeugt var o={ valueOf:function() { return 4; } }; die Auswertung von o + 2; 6, eine number, die Auswertung von o + '2' erzeugt '42', einen string.

Um zu sehen, wie die Übersichtstabelle erstellt wurde, besuchen Sie http://jsfiddle.net/1obxuc7m/

Antwort #2

Der +-Operator von JavaScript hat zwei Zwecke: das Addieren von zwei Zahlen oder das Verbinden von zwei Strings. Er hat kein spezifisches Verhalten für Arrays, daher werden sie in Strings umgewandelt und dann verbunden.

Wenn Sie zwei Arrays zu einem neuen verbinden möchten, verwenden Sie stattdessen die .concat-Methode:

[1, 2].concat([3, 4]) // [1, 2, 3, 4]

Wenn Sie alle Elemente eines Arrays effizient zu einem anderen hinzufügen möchten, müssen Sie die .push-Methode verwenden:

var data = [1, 2];

// ES6+:
data.push(...[3, 4]);
// or legacy:
Array.prototype.push.apply(data, [3, 4]);

// data is now [1, 2, 3, 4]

Das Verhalten des +-Operators ist in ECMA-262 5e Abschnitt 11.6.1 definiert:

11.6.1 Der Additionsoperator ( + )

Der Additionsoperator führt entweder eine Verkettung von Zeichenketten oder eine numerische Addition aus. Die Produktion AdditiveExpression : AdditiveExpression + MultiplicativeExpression wird wie folgt ausgewertet:

  1. Sei lref das Ergebnis der Auswertung von AdditiveExpression.
  2. Sei lval GetValue(lref).
  3. Sei rref das Ergebnis der Auswertung von MultiplicativeExpression.
  4. Sei rval GetValue(rref).
  5. Sei lprim ToPrimitive(lval).
  6. Sei rprim ToPrimitive(rval).
  7. Wenn Type(lprim) String ist oder Type(rprim) String ist, dann

    1. Gib den String zurück, der das Ergebnis der Verkettung von ToString(lprim) gefolgt von ToString(rprim) ist
  8. Gib das Ergebnis der Anwendung der Additionsoperation auf ToNumber(lprim) und ToNumber(rprim) zurück. Siehe die Anmerkung unten zu 11.6.3.

Sie können sehen, dass jeder Operand in ToPrimitive umgewandelt wird. Wenn man weiterliest, kann man herausfinden, dass ToPrimitive Arrays immer in Zeichenketten umwandelt, wodurch dieses Ergebnis entsteht.

Antwort #3

Es addiert die beiden Arrays, als ob sie Strings wären.

Die Zeichenketten-Darstellung für das erste Array wäre "1,2" und für das zweite wäre sie "3,4". Wenn also das +-Zeichen gefunden wird, kann es Arrays nicht addieren und sie dann als Zeichenketten zusammenfügen.

Antwort #4

Das + verkettet Strings, also wandelt es die Arrays in Strings um.

[1,2] + [3,4]
'1,2' + '3,4'
1,23,4

Um Arrays zu kombinieren, verwenden Sie concat.

[1,2].concat([3,4])
[1,2,3,4]

Antwort #5

In JavaScript führt der binäre Additionsoperator (+) sowohl numerische Addition als auch Zeichenkettenverkettung durch. Wenn jedoch sein erstes Argument weder eine Zahl noch eine Zeichenkette ist, wird es in eine Zeichenkette umgewandelt (daher "1,2"), dann passiert dasselbe mit dem zweiten "3,4" und sie werden zu "1,23,4" verkettet.

Versuchen Sie stattdessen, die "concat"-Methode von Arrays zu verwenden:

var a = [1, 2];
var b = [3, 4];
a.concat(b) ; // => [1, 2, 3, 4];

Antwort #6

Es wandelt die einzelnen Arrays in Zeichenketten um und kombiniert dann die Zeichenketten.

Antwort #7

Es sieht so aus, als würde JavaScript deine Arrays in Strings umwandeln und zusammenfügen. Wenn du Tupel zusammenfügen möchtest, musst du eine Schleife oder eine Map-Funktion verwenden.

Antwort #8

[1,2]+[3,4] in JavaScript ist dasselbe wie die Auswertung von:

new Array( [1,2] ).toString() + new Array( [3,4] ).toString();

Und um also Ihr Problem zu lösen, wäre das Beste, zwei Arrays an Ort und Stelle oder ohne Erstellung eines neuen Arrays zu addieren:

var a=[1,2];
var b=[3,4];
a.push.apply(a, b);

Antwort #9

Es macht genau das, was Sie verlangt haben.

Was du zusammenfügst, sind Array-Referenzen (die JS in Strings umwandelt), nicht Zahlen, wie es scheint. Es ist ein bisschen so, als würde man Strings zusammenfügen: "hello " + "world"="hello world"

Verwandte Artikel