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?
javascript
string
numbers
operators
Nirgn
quelle
quelle
Antworten:
Die Verkettung von
+
Zeichenfolgen erfolgt mit, sodass Javascript die erste numerische 1 in eine Zeichenfolge konvertiert und "1" und "1" zu "11" verkettet.Sie können keine Subtraktion für Zeichenfolgen durchführen, daher konvertiert Javascript die zweite "1" in eine Zahl und subtrahiert 1 von 1, was zu Null führt.
quelle
[] + {}
Sie dies im Grunde[].toString() + ({}).toString()
(da JavaScript das betroffene Array und Objekt in eine Zeichenfolge konvertiert, bevor Sie sie verketten). Und, weil[].toString === ''
und({}).toString() === '[object Object]'
, Ihr Endergebnis für[] + {} === '[object Object]'
. Es ist vollkommen logisch.{} + []
? :) Gehen Sie voran, wenden Sie die gleiche Logik an :)+
Zeichen davor befindet (z. B. wie+new Date
der numerische Wert zurückgegeben wird) desDate
Objekts (der UNIX-Zeitstempel) oder+true
gibt den numerischen Wert von zurücktrue
(d. h.1
). Aus diesem Grund wird der Zusatz{} + 0
. Da das Objekt keinen numerischen Wert hat, wird dies zu dem+0
, als das JavaScript ausgibt0
.[] + {}
eine Verkettung durchgeführt werden, während{} + []
dies nicht der Fall ist? Außerdem ist Ihre Aussage, dass "Objekt keinen numerischen Wert hat", falsch:+{}
Gibt zurückNaN
. UndNaN + 0
ist esNaN
nicht0
. Wie @Yury jedoch sagte, ist es sinnlos, JavaScript-Zwang vom Standpunkt praktischer Situationen oder des gesunden Menschenverstandes aus zu diskutieren.[] + {}
und{} + []
sind eigentlich zwei völlig unterschiedliche Aussagen+
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", as gezeigt , optisch:│┼│ ニ ⊞
)-
hat jedoch nur eine Bedeutung: subtrahieren. Also subtrahiert es.Diese Art von Problem tritt in anderen Sprachen wie PHP nicht auf, wo "verketten"
.
statt "nicht mehr eindeutig" ist+
. Wieder andere Sprachen wie MySQL haben nicht einmal einen Verkettungsoperator, sondern verwendenCONCAT(a,b,c...)
.quelle
Weil die Spezifikation dies ausdrücklich vorschreibt. Seite 75. Beachten Sie den Unterschied zwischen 11.6.1 Schritten 5-8 und 11.6.2 Schritten 5-7.
1-4
. ...5
. Sei lprim ToPrimitive (lval).6
. Sei rprim ToPrimitive (rval).7
. Wenn Type (lprim) String oder Type (rprim) String ist, dann7a
. Gibt den String zurück, der das Ergebnis der Verkettung von ToString (lprim) gefolgt von ToString (rprim) ist.8
. Geben Sie das Ergebnis der Anwendung der Additionsoperation auf ToNumber (lprim) und ToNumber (rprim) zurück.1-4
. ...5
. Sei lnum ToNumber (lval).6
. Sei rnum ToNumber (rval).7
. Geben Sie das Ergebnis der Anwendung der Subtraktionsoperation auf lnum und rnum zurückZusammenfassung Im Falle einer Addition wird der zweite Operand ebenfalls in eine Zeichenfolge konvertiert, wenn einer der Operanden bei der Konvertierung in einen primitiven Wert ohne Hinweise plötzlich zu einer Zeichenfolge wird. Bei Subtraktion werden beide Operanden in eine Zahl umgewandelt.
quelle
[] + [] === ""
:) Liegt es an der Unklarheit über Verkettung oder Addition? LOL+
ist sowohl ein Additionsoperator für numerische Variablen als auch ein Verkettungsoperator für Zeichenfolgen.Immer wenn nach a eine Zeichenfolge steht
+
, verwendet Javascript den+
als Verkettungsoperator und konvertiert (tippt) so viele Begriffe wie möglich um die Zeichenfolge, damit sie verkettet werden können. Das ist nur das Verhalten von Javascript. (Wenn Sie es versucht habenconsole.log(23 + 2 + "." + 1 + 5 + "02" + 02);
, erhalten Sie das Ergebnis25.15022
. Die Nummer02
wurde2
vor der Verkettung in die Zeichenfolge eingegeben .-
kann nur ein Subtraktionsoperator sein. Wenn also eine Zeichenfolge angegeben wird, wird der Typ der Zeichenfolge implizit"1"
in eine Zahl geändert1
. Wenn es das nicht tun"1" - 1
würde, würde es keinen Sinn ergeben. Wenn Sie es versucht haben, erhaltenconsole.log(23 + 2 + 1 + 5 - "02" + 03);
Sie 32 - die Zeichenfolge02
wird in die Zahl umgewandelt2
. Der Begriff nach dem-
muss in eine Zahl umgewandelt werden können; Wenn Sie es versucht haben, werdenconsole.log(23 - 2 - "." - 1 - 5 - 02 - "02");
SieNaN
zurückgegeben.Noch wichtiger ist, wenn Sie es versucht haben
console.log(23 + 2 + "." + 1 + 5 - "02" + 03);
, wird ausgegeben26.15
, wo alles zuvor-
als Zeichenfolge behandelt wurde (weil es eine Zeichenfolge enthält"."
, und dann wird der Begriff nach dem-
als Zahl behandelt.quelle
In JavaScript ** gibt es keinen dedizierten String-Verkettungsoperator. Der Additionsoperator
+
führt je nach Art der Operanden entweder eine Zeichenfolgenverkettung oder eine Addition durch:"1" + 1 // "11" 1 + "1" // "11" 1 + 1 // 2
Es gibt kein Gegenteil von Verkettung (glaube ich) und der Subtraktionsoperator
-
führt nur eine Subtraktion durch, unabhängig von der Art der Operanden:"1" - 1 // 0 1 - "1" // 0 1 - 1 // 0 "a" - 1 // NaN
** Der
.
Operator in PHP und der&
Operator in VB sind dedizierte String-Verkettungsoperatoren.quelle
Gemäß dem Standard-EcmaScript 262. Die Operatoren
+
und-
verhalten sich unterschiedlich, wenn Zeichenfolgen beteiligt sind. Der erste konvertiert jeden Wert in eine Zeichenfolge. Der zweite konvertiert jeden Wert in eine Zahl.Aus dem Standard:
Diese Regeln implizieren, dass, wenn der Ausdruck einen Zeichenfolgenwert enthält, alle an der
+
Operation beteiligten Werte in eine Zeichenfolge konvertiert werden. Wenn der+
Operator in JavaScript mit Zeichenfolgen verwendet wird, werden diese verkettet. Aus diesem Grund wirdconsole.log("5"+1)
"51" zurückgegeben.1
wird in eine Zeichenfolge konvertiert und dann werden "5" + "1" miteinander verkettet.Die obige Regel gilt jedoch nicht für den
-
Betreiber. Wenn Sie ein verwenden, werden-
alle Werte gemäß dem Standard in Zahlen konvertiert (siehe unten). Daher wird in diesem Fall in"5"
konvertiert5
und dann1
subtrahiert.Aus dem Standard:
Operatordefinition aus dem Standard-EcmaScript 262.
Betreiber + : http://www.ecma-international.org/ecma-262/5.1/#sec-11.6.1
Betreiber - : http://www.ecma-international.org/ecma-262/5.1/#sec-11.6.2
quelle
Mit Plus und einer Zeichenfolge geben
""
Sie grundsätzlich eine Zeichenfolge zurück, da Sie eine Verkettung durchführen:typeof ("" + 1 + 0) // string typeof (1 + 0) // number
Wenn
-
Sie stattdessen verwenden, konvertieren Sie in eine Zahl, da eine Verkettung von Zeichenfolgen möglich ist:typeof ("" - 1 + 0) // number
quelle