webentwicklung-frage-antwort-db.com.de

Warum behandelt JavaScript die Plus- und Minus-Operatoren zwischen Zeichenfolgen und Zahlen unterschiedlich?

Ich verstehe nicht, warum JavaScript so funktioniert.

console.log("1" + 1);
console.log("1" - 1);

Die erste Zeile gibt 11 und die zweite 0 aus. Warum behandelt JavaScript die erste als Zeichenfolge und die zweite als Zahl?

61
Nir

Die Verkettung der Zeichenfolgen erfolgt mit + also wandelt Javascript die erste Ziffer 1 in eine Zeichenkette um und verkettet "1" und "1" zu "11".

Sie können keine Zeichenfolgen subtrahieren, daher konvertiert Javascript die zweite "1" in eine Zahl und subtrahiert 1 von 1, was zu Null führt.

93

+ Ist nicht eindeutig. Es kann "verketten" oder "hinzufügen" bedeuten. Da eine Seite eine Zeichenfolge ist, bedeutet dies "verketten", daher ist das Ergebnis 11 (was übrigens als kleines Kind einer meiner Lieblingswitze war. Das und "1 + 1 = Fenster", wie visuell dargestellt: │┼│ ニ ⊞)

- Hat jedoch nur eine Bedeutung: subtrahieren. Also subtrahiert es.

Diese Art von Problem tritt in anderen Sprachen wie PHP nicht auf, bei denen "verketten" . Anstelle von + Ist, wodurch keine Mehrdeutigkeit entsteht. Wieder andere Sprachen wie MySQL haben nicht einmal einen Verkettungsoperator, sondern verwenden stattdessen CONCAT(a,b,c...).

33

Weil die Spezifikation ausdrücklich anweist, dies zu tun. Seite 75. Beachten Sie den Unterschied zwischen 11.6.1, Schritte 5-8 und 11.6.2, Schritte 5-7.

11.6.1 - beschreibt, wie der Additionsoperator funktioniert

1-4. ...

5. Sei lprim ToPrimitive (lval).

6. Sei rprim ToPrimitive (rval).

7. Wenn Type (lprim) String ist oder Type (rprim) String ist, dann

7a. Gibt den String zurück, der das Ergebnis der Verkettung von ToString (lprim) gefolgt von ToString (rprim) ist.

8. Das Ergebnis der Anwendung der Additionsoperation auf ToNumber (lprim) und ToNumber (rprim) zurückgeben

11.6.2 - beschreibt, wie der Subtraktionsoperator funktioniert

1-4. ...

5. Sei lnum ToNumber (lval).

6. Sei rnum ToNumber (rval).

7. Gibt das Ergebnis der Subtraktion von lnum und rnum zurück

Zusammenfassung Wenn einer der Operanden beim Konvertieren in einen primitiven Wert ohne Hinweise plötzlich zu einem String wird, wird der zweite ebenfalls in einen String konvertiert. Im Falle einer Subtraktion werden beide Operanden in eine Zahl umgewandelt.

22
Yury Tarabanko

+ Ist sowohl ein Additionsoperator für numerische Variablen als auch ein Verkettungsoperator für Zeichenfolgen.

Immer wenn ein String nach einem + Steht, verwendet Javascript den + Als Verkettungsoperator und konvertiert (tippt) so viele Begriffe wie möglich um den String, damit er sie verketten kann. Das ist nur das Verhalten von Javascript. (Wenn Sie console.log(23 + 2 + "." + 1 + 5 + "02" + 02); ausprobiert haben, erhalten Sie das Ergebnis 25.15022. Die Zahl 02 Wurde vor der Verkettung in die Zeichenfolge 2 Eingegeben.

- Kann nur ein Subtraktionsoperator sein. Wenn also ein String angegeben wird, wird der Typ des Strings "1" Implizit in einen numerischen 1 Geändert. ; Wenn dies nicht der Fall wäre, würde "1" - 1 keinen Sinn ergeben. Wenn Sie console.log(23 + 2 + 1 + 5 - "02" + 03); ausprobiert haben, erhalten Sie 32 - der String 02 Wird in die Zahl 2 Umgewandelt. Der Ausdruck nach dem - Muss in eine Zahl umgewandelt werden können; Wenn Sie console.log(23 - 2 - "." - 1 - 5 - 02 - "02"); ausprobiert haben, wird NaN zurückgegeben.

Noch wichtiger ist, wenn Sie console.log(23 + 2 + "." + 1 + 5 - "02" + 03); ausprobiert haben, wird 26.15 Ausgegeben, wobei alles vor - Als Zeichenfolge behandelt wurde (weil es eine Zeichenfolge "." Enthält). , und dann wird der Ausdruck nach dem - als Zahl behandelt.

7
dayuloli

In JavaScript ** gibt es keinen dedizierten Operator für die Verkettung von Zeichenfolgen. Der Additionsoperator + führt je nach Art der Operanden entweder eine Zeichenkettenverkettung oder eine Addition durch:

"1" +  1  // "11"
 1  + "1" // "11"
 1  +  1  // 2

Es gibt kein Gegenteil von Verkettung (glaube ich) und dem Subtraktionsoperator - führt unabhängig von der Art der Operanden nur eine Subtraktion durch:

"1" -  1  // 0
 1  - "1" // 0
 1  -  1  // 0
"a" -  1  // NaN

** Das . Operator in PHP und & Operator in VB sind dedizierte String-Verkettungsoperatoren.

6
Salman A

Gemäß dem Standard-EcmaScript 262. Die Operatoren + Und - Verhalten sich bei Strings unterschiedlich. Der erste konvertiert jeden Wert in einen String. Die Sekunde wandelt jeden Wert in eine Zahl um.

Aus dem Standard:

Wenn Type (lprim) String ist oder Type (rprim) String ist, geben Sie den String zurück, der das Ergebnis der Verkettung von ToString (lprim) gefolgt von ToString (rprim) ist.

Diese Regel impliziert, dass alle an der Operation + Beteiligten Werte in eine Zeichenfolge konvertiert werden, wenn der Ausdruck einen Zeichenfolgewert enthält. Wenn in JavaScript der Operator + Für Zeichenfolgen verwendet wird, werden diese verkettet. Aus diesem Grund gibt console.log("5"+1) "51" zurück. 1 Wird in eine Zeichenfolge konvertiert und dann werden "5" + "1" miteinander verkettet.

Die obige Regel gilt jedoch nicht für den Operator -. Wenn Sie einen - Verwenden, werden alle Werte gemäß dem Standard in Zahlen umgewandelt (siehe unten). Daher wird in diesem Fall "5" In 5 Umgewandelt und dann 1 Subtrahiert.

Aus dem Standard:

5 Sei lnum ToNumber (lval).

6 Sei rnum ToNumber (rval).


Operatordefinition aus dem Standard-EcmaScript 262.

Operator + : http://www.ecma-international.org/ecma-262/5.1/#sec-11.6.1 Operator + definition

Operator - : http://www.ecma-international.org/ecma-262/5.1/#sec-11.6.2 Operator - definition

3
Giuseppe Pes

Verwenden von Plus und einer Zeichenfolge "" Sie geben im Grunde eine Zeichenfolge zurück, weil Sie eine Verkettung durchführen:

typeof ("" + 1 + 0)  // string
typeof (1 + 0)  // number

Beim Benutzen - stattdessen konvertieren Sie in eine Zahl, da die Verkettung von Zeichenfolgen möglich ist:

typeof ("" - 1 + 0) // number
0
GibboK