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

Lesezeit: 7 Minuten

Warum behandelt JavaScript die Plus und Minusoperatoren zwischen Zeichenfolgen und
Nirgn

Ich verstehe nicht, warum JavaScript so funktioniert.

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

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

  • +1 – obwohl die Antwort warum Der Grund ist für jeden, der mit JS vertraut ist, offensichtlich warum die offensichtliche Antwort wahr ist ist immer noch jenseits meines Verständnisses – und ich nehme an, ich bin nicht der einzige … JS scheitert POLA in vielerlei Hinsicht Seufzen stackoverflow.com/questions/9032856/…

    Benutzer719662

    24. Juni 2014 um 15:02 Uhr


  • Ich habe das Gefühl, dass dieser Link zusammen mit jeder Verrücktheit bei der Eingabe von Javascript gepostet werden sollte: Destroyallsoftware.com/talks/wat

    – DLeh

    24. Juni 2014 um 17:38 Uhr

  • @DLeh: Ich wollte gerade einen Link zu diesem Video posten: D

    – Raketen-Hazmat

    24. Juni 2014 um 18:33 Uhr

  • Auch verwandt: Deine Sprache ist scheiße

    – Simon Forsberg

    24. Juni 2014 um 20:14 Uhr

Die String-Verkettung ist erledigt + Javascript konvertiert also die erste Ziffer 1 in eine Zeichenfolge und verkettet “1” und “1”, wodurch “11” entsteht.

Sie können Strings nicht subtrahieren, daher wandelt Javascript die zweite “1” in eine Zahl um und subtrahiert 1 von 1, was zu Null führt.

  • @YuryTarabanko Okay. Verkettung (also keine Addition) immer setzt 2 Saiten zusammen. Also, wenn Sie versuchen, dies zu tun [] + {}tun Sie im Grunde [].toString() + ({}).toString() (weil JavaScript das betroffene Array und Objekt in einen String konvertiert, bevor es sie verkettet). Und weil [].toString === '' und ({}).toString() === '[object Object]'Ihr Endergebnis für [] + {} === '[object Object]'. Es ist vollkommen logisch.

    – Joeytje50

    24. Juni 2014 um 10:58 Uhr


  • @Joeytje50 Richtig. Wie wäre es mit {} + []? 🙂 Fahren Sie fort, wenden Sie die gleiche Logik an 🙂

    – Juri Tarabanko

    24. Juni 2014 um 11:01 Uhr

  • @YuryTarabanko Da Objekte und Arrays weder verkettet noch addiert werden können, führt das Zusammenfügen dieser 2 in dieser Reihenfolge dazu, dass das Array in eine Zahl anstelle einer Zeichenfolge konvertiert wird, da die + Zeichen steht davor (wie wie +new Date gibt den numerischen Wert von zurück Date Objekt (der UNIX-Zeitstempel) oder +true gibt den numerischen Wert von zurück truewelches ist 1). Aus diesem Grund wird der Zusatz {} + 0. Da das Objekt keinen numerischen Wert hat, wird this +0die JavaScript als ausgibt 0.

    – Joeytje50

    24. Juni 2014 um 11:15 Uhr

  • @Joeytje50 Haha, naja das ist nicht wirklich das gleich Logik. Wenn “Objekte und Arrays weder verkettet noch addiert werden können”, warum dann [] + {} Verkettung durchführen, während {} + [] nicht? Außerdem ist Ihre Aussage, dass “Objekt keinen numerischen Wert hat”, falsch: +{} kehrt zurück NaN. Und NaN + 0 ist NaNnicht 0. Wie @Yury jedoch sagte, ist es sinnlos, den JavaScript-Typzwang vom Standpunkt praktischer Situationen oder des gesunden Menschenverstandes aus zu diskutieren.

    – Ajedi32

    24. Juni 2014 um 14:11 Uhr

  • Nur fürs Protokoll, eine öffnende geschweifte Klammer am Anfang einer Zeile in JavaScript ist ein Block, kein Objektliteral; damit [] + {} und {} + [] sind eigentlich zwei völlig unterschiedliche aussagen

    – Jakob Lang

    24. Juni 2014 um 14:21 Uhr

Warum behandelt JavaScript die Plus und Minusoperatoren zwischen Zeichenfolgen und
Niet the Dark Absol

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

- hat aber nur eine Bedeutung: subtrahieren. Es wird also subtrahiert.

Diese Art von Problem ist in anderen Sprachen wie PHP nicht vorhanden, wo “concatenate” ist . anstatt +, ohne Zweideutigkeit. Wieder andere Sprachen wie MySQL haben nicht einmal einen Verkettungsoperator, sondern verwenden CONCAT(a,b,c...).

  • Eine andere Lösung zur Vermeidung dieses Problems (und vieler anderer Probleme, die ebenfalls in JavaScript auftreten) besteht darin, keine impliziten Konvertierungen zuzulassen. Python zum Beispiel gibt einfach einen Fehler aus, wenn Sie so etwas wie das obige versuchen, was all diese unintuitiven Probleme von vornherein vermeidet. Implizite Konvertierungen in einer dynamisch typisierten Sprache sind eine schreckliche Idee.

    – Voo

    24. Juni 2014 um 11:36 Uhr


1647264911 463 Warum behandelt JavaScript die Plus und Minusoperatoren zwischen Zeichenfolgen und
Juri Tarabanko

Weil die spez ausdrücklich dazu auffordert. 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. Gibt das Ergebnis der Anwendung der Additionsoperation auf ToNumber(lprim) und ToNumber(rprim) zurück

11.6.2 – beschreibt, wie der Subtraktionsoperator funktioniert

1-4. …

5. Lassen Sie lnum ToNumber(lval) sein.

6. Sei rnum ToNumber(rval).

7. Gibt das Ergebnis der Anwendung der Subtraktionsoperation auf lnum und rnum zurück

Zusammenfassung
Im Falle einer Addition, wenn einer der Operanden bei der Konvertierung in einen primitiven Wert ohne Hinweise plötzlich zu einer Zeichenfolge wird, wird der zweite ebenfalls in eine Zeichenfolge konvertiert. Bei einer Subtraktion werden beide Operanden in eine Zahl umgewandelt.

  • @Joeytje50 Zum Beispiel, versuch mal zu fantasieren warum [] + [] === "" 🙂 Liegt es an der Unklarheit über Verkettung vs. Addition? lol

    – Juri Tarabanko

    24. Juni 2014 um 10:20 Uhr

  • +1, weil dies die einzige maßgebliche Antwort ist. Der ganze Rest mag nützliche Eselsbrücken sein, aber die ultimative Antwort lautet: „Weil die Spezifikation es so sagt“, und zwar, weil Brendan Eich dachte, es sei eine gute Idee in diesen berüchtigten 10 Tagen.

    – Matteo Italien

    24. Juni 2014 um 21:00 Uhr

Es gibt keinen dedizierten String-Verkettungsoperator in JavaScript**. Der Additionsoperator + führt je nach Art der Operanden entweder eine Zeichenfolgenverkettung oder -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

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

+ ist sowohl ein Additionsoperator für numerische Variablen und a Verkettungsoperator für Saiten.

Immer wenn nach a eine Zeichenfolge steht +Javascript entscheidet sich für die Verwendung von + als Verkettungsoperator und konvertiert (typisiert) so viele Begriffe wie möglich um die Zeichenfolge herum, damit sie verkettet werden können. Das ist nur das Verhalten von Javascript. (Falls du es versucht hast console.log(23 + 2 + "." + 1 + 5 + "02" + 02);erhalten Sie das Ergebnis 25.15022. Die Nummer 02 wurde in die Zeichenfolge eingegeben 2 bevor sie verkettet werden.

- kann nur ein sein Subtraktionsoperatorwenn also eine Zeichenfolge angegeben wird, wird der Typ der Zeichenfolge implizit geändert "1" in eine Zahl 1; Wenn es das nicht getan hat, gibt es keine Möglichkeit "1" - 1 würde Sinn machen. Wenn du es versucht hast console.log(23 + 2 + 1 + 5 - "02" + 03); Sie erhalten 32 – die Zeichenfolge 02 wird in die Zahl umgewandelt 2. Der Begriff nach dem - muss in eine Zahl umgewandelt werden können; wenn du es versucht hast console.log(23 - 2 - "." - 1 - 5 - 02 - "02"); Du wirst kriegen NaN ist zurückgekommen.

Noch wichtiger, wenn Sie es versucht haben console.log(23 + 2 + "." + 1 + 5 - "02" + 03);es wird ausgegeben 26.15wo alles vorher - wurde als Zeichenfolge behandelt (weil sie eine Zeichenfolge enthält "."und dann der Begriff nach dem - wird als Zahl behandelt.

1647264912 11 Warum behandelt JavaScript die Plus und Minusoperatoren zwischen Zeichenfolgen und
Giuseppe Pes

Nach dem Standard EcmaScript 262. Die + und - Operatoren verhalten sich anders, wenn Strings beteiligt sind. Die erste wandelt jeden Wert in einen String um. Die zweite wandelt jeden Wert in eine Zahl um.

Aus der Norm:

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

Diese Regel impliziert, dass, wenn in dem Ausdruck ein Zeichenfolgenwert vorhanden ist, alle an dem beteiligten Werte enthalten sind + Operation werden in einen String konvertiert. In JavaScript, wenn die + Operator wird mit Strings verwendet, er verkettet sie. Deshalb console.log("5"+1) gibt “51” zurück. 1 wird in einen String umgewandelt und dann werden “5” + “1” miteinander verkettet.

Die obige Regel gilt jedoch nicht für die - Operator. Wenn Sie eine verwenden - alle Werte werden gemäß Standard in Zahlen umgewandelt (siehe unten). Daher ist in diesem Fall "5" umgewandelt wird 5 und dann 1 abgezogen wird.

Aus der Norm:

5 Lassen Sie lnum ToNumber(lval) sein.

6 Sei rnum ToNumber(rval).


Operatordefinition aus dem Standard EcmaScript 262.

Betreiber + : 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

1647264914 505 Warum behandelt JavaScript die Plus und Minusoperatoren zwischen Zeichenfolgen und
GibboK

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 eine Zeichenfolgenverkettung möglich ist:

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

1001770cookie-checkWarum behandelt JavaScript die Plus- und Minusoperatoren zwischen Zeichenfolgen und Zahlen unterschiedlich?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy