Perché JavaScript gestisce gli operatori più e meno tra stringhe e numeri in modo diverso?

Non capisco perché JavaScript funzioni in questo modo.

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

La prima riga stampa 11 e la seconda stampa 0. Perché JavaScript gestisce il primo come stringa e il secondo come numero?

La concatenazione delle stringhe viene eseguita con + quindi Javascript convertirà il primo numero 1 in una stringa e concatenerà “1” e “1” facendo “11”.

Non è ansible eseguire la sottrazione su stringhe, quindi JavaScript converte il secondo “1” in un numero e sottrae 1 da 1, risultando in zero.

+ è ambiguo. Può significare “concatenare” o “aggiungere”. Dato che un lato è una stringa, significa “concatenare”, quindi il risultato è 11 (che, a proposito, è stata una delle mie battute preferite da bambino. Quella e “1 + 1 = finestra”, come mostrato visivamente: │┼│ ニ ⊞ )

- tuttavia ha solo un significato: sottrarre. Quindi sottrae.

Questo tipo di problema non è presente in altre lingue come PHP, dove è “concatenato” . invece di + , non facendo ambiguità. Ancora altri linguaggi come MySQL non hanno nemmeno un operatore di concatenazione, ma usano CONCAT(a,b,c...) .

Perché la specifica dice esplicitamente di farlo. Pagina 75. Notare la differenza tra 11.6.1 passaggi 5-8 e 11.6.2 passaggi 5-7.

11.6.1 – descrive come funziona l’operatore di addizione

1-4 . …

5 . Lascia che lprim sia ToPrimitive (lval).

6 . Sia rprim be ToPrimitive (rval).

7 . Se Type (lprim) è String o Type (rprim) è String, quindi

7a . Restituisce la stringa che è il risultato della concatenazione di ToString (lprim) seguito da ToString (rprim)

8 . Restituisce il risultato dell’applicazione dell’operazione di aggiunta a ToNumber (lprim) e ToNumber (rprim)

11.6.2 – descrive come funziona l’operatore di sottrazione

1-4 . …

5 . Sia lnum essere ToNumber (lval).

6 . Sia rnum ToNumber (rval).

7 . Restituisce il risultato dell’applicazione dell’operazione di sottrazione a lnum e rnum

Riepilogo In caso di aggiunta se uno qualsiasi degli operandi convertiti al valore primitivo senza alcun suggerimento diventa improvvisamente una stringa, anche il secondo viene convertito in una stringa. In caso di sottrazione, entrambi gli operandi vengono convertiti in un numero.

+ è sia un operatore di addizione per le variabili numeriche, sia un operatore di concatenazione per le stringhe.

Ogni volta che c’è una stringa dopo un + , Javascript sceglierà di utilizzare il + come operatore di concatenazione e convertirà (digitato) il maggior numero ansible di termini attorno alla stringa in modo che possa concatenarli. Questo è solo il comportamento di Javascript. (Se hai provato console.log(23 + 2 + "." + 1 + 5 + "02" + 02); otterrai il risultato 25.15022 . Il numero 02 stato digitato nella stringa 2 prima di essere concatenato.

- può essere solo un operatore di sottrazione , quindi quando viene data una stringa, cambierà implicitamente il tipo della stringa "1" in un numero 1 ; se non lo facesse, non c’è modo "1" - 1 avrebbe senso. Se hai provato console.log(23 + 2 + 1 + 5 - "02" + 03); avrai 32 – la stringa 02 viene convertita nel numero 2 . Il termine dopo il - deve poter essere convertito in un numero; se hai provato console.log(23 - 2 - "." - 1 - 5 - 02 - "02"); Otterrai NaN restituito.

Ancora più importante, se hai provato console.log(23 + 2 + "." + 1 + 5 - "02" + 03); , uscirà 26.15 , dove tutto prima - stato trattato come una stringa (perché contiene una stringa "." , e quindi il termine dopo il - viene trattato come un numero.

Non esiste un operatore di concatenazione di stringhe dedicato in JavaScript **. L’operatore di addizione + esegue o concatenazione di stringhe o aggiunte, a seconda del tipo di operandi:

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

Non c’è opposto di concatenazione (penso) e l’operatore di sottrazione - esegue solo la sottrazione indipendentemente dal tipo di operandi:

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

** Il . operatore in PHP e operatore in VB sono operatori dedicati di concatenazione di stringhe.

Secondo lo standard EcmaScript 262. Gli operatori + e - comportano diversamente quando sono coinvolte le stringhe. Il primo converte ogni valore in una stringa. Il secondo converte ogni valore in un numero.

Dallo standard:

Se Type (lprim) è String o Type (rprim) è String, quindi Restituisce String che è il risultato della concatenazione di ToString (lprim) seguito da ToString (rprim)

Questa regola implica che se nell’espressione esiste un valore stringa, tutti i valori coinvolti nell’operazione + vengono convertiti in una stringa. In JavaScript quando l’operatore + viene utilizzato con stringhe, le concatena. Questo è il motivo per cui console.log("5"+1) restituisce “51”. 1 viene convertito in una stringa e quindi “5” + “1” vengono concatenati insieme.

Tuttavia, la regola di cui sopra non si applica per l’operatore. Quando si utilizza a - tutti i valori vengono convertiti in numeri in base allo standard (vedere di seguito). Pertanto, in questo caso, "5" viene convertito in 5 e quindi 1 viene sottratto.

Dallo standard:

5 Sia lNum essere ToNumber (lval).

6 Sia rnum ToNumber (rval).


Definizione dell’operatore dallo standard EcmaScript 262.

Operatore + : http://www.ecma-international.org/ecma-262/5.1/#sec-11.6.1 Operatore + definizione

Operatore : http://www.ecma-international.org/ecma-262/5.1/#sec-11.6.2 Operatore - definizione