Читать книгу JavaScript – Das Handbuch für die Praxis - David Flanagan - Страница 88
4.8.1Der +-Operator
ОглавлениеDer binäre +-Operator addiert numerische Operanden oder verkettet String-Operanden:
1 + 2 // => 3
"hello" + " " + "there" // => "hello there"
"1" + "2" // => "12"
Wenn die Werte der Operanden entweder nur Zahlen oder nur Strings sind, ist offensichtlich, was der +-Operator mit ihnen macht. In allen anderen Fällen sind hingegen Typumwandlungen erforderlich. Die Operation, die letztendlich ausgeführt wird, ist von diesen Umwandlungen abhängig. Die Umwandlungsregeln für + bevorzugen die String-Verkettung: Ist einer der Operanden ein String oder ein Objekt, das in einen String umgewandelt werden kann, wird der andere Operand in einen String umgewandelt, und eine String-Verkettung wird durchgeführt. Eine Addition erfolgt nur dann, wenn keiner der Operanden stringartig ist.
Formal verhält sich der +-Operator folgendermaßen:
Ist einer seiner Operanden ein Objekt, wird dieses mit dem in 3.9.3 beschriebenen Algorithmus in einen Primitivwert konvertiert. Date-Objekte werden über ihre toString()-Methode umgewandelt, alle anderen Objekte über ihre valueOf()-Methode, falls diese Methode einen primitiven Wert liefert. Die meisten Objekte besitzen jedoch keine nützliche valueOf()-Methode und werden deswegen ebenfalls über toString() umgewandelt.
Ist nach der Objekt-zu-Primitivwert-Umwandlung einer der Operanden ein String, wird der andere ebenfalls in einen String umgewandelt, und eine String-Verkettung wird durchgeführt.
Andernfalls werden beide Operanden in Zahlen (oder NaN) konvertiert, die daraufhin addiert werden.
Hier einige Beispiele:
1 + 2 // => 3: Addition.
"1" + "2" // => "12": Verkettung.
"1" + 2 // => "12": Verkettung nach Zahl-zu-String-Umwandlung.
1 + {} // => "1[object Object]": Verkettung nach Objekt-zu-String-
// Umwandlung.
true + true // => 2: Addition nach Boolescher-Wert-zu-Zahl-Umwandlung.
2 + null // => 2: Addition nach Umwandlung von null in 0.
2 + undefined // => NaN: Addition nach Umwandlung von undefined in NaN.
Schließlich ist noch zu beachten, dass der Operator + bei Zeichenketten und Zahlen möglicherweise nicht assoziativ ist. Oder anders ausgedrückt: Das Ergebnis kann von der Reihenfolge abhängen, in der die Operationen durchgeführt werden.
Ein Beispiel:
1 + 2 + " blind mice" // => "3 blind mice"
1 + (2 + " blind mice") // => "12 blind mice"
Da die erste Zeile keine Klammern enthält und der +-Operator linksassoziativ ist, werden zunächst die beiden Zahlen addiert, bevor ihre Summe mit dem String verkettet wird. In der zweiten Zeile ändern Klammern die Abfolge dieser Operationen: Die Zahl 2 wird mit dem String verkettet, und es wird ein neuer String erzeugt. Dann wird die Zahl 1 mit dem neuen String verkettet, um das endgültige Ergebnis zu erzeugen.