2013-12-12 11 views
12
console.log(true+true); //2 
console.log(typeof(true+true)); //number 
console.log(isNaN(true+true)); //false 

Perché si sommano 2 tipi booleani che producono un numero? Capisco che se non fossero uguali (1/0 (binario?)) Sarebbe imbarazzante provare a eseguire aritmetiche su un tipo booleano, ma non riesco a trovare il ragionamento dietro questa logica.JavaScript Aggiunta di booleani

+2

Perché vengono convertiti in numeri 'Number (true) + Number (true) === 2' –

+0

Perché' true' è 1 quando viene convertito automaticamente in un numero. Il sistema di tipo dinamico di Javascript in azione. –

+0

'true' esegue il cast di' 1' – elclanrs

risposta

9

Funziona così perché è così che è specificato a lavorare.

Lo standard EcmaScript specifica che, a meno che uno degli argomenti non sia una stringa, si supponga che l'operatore + indichi l'aggiunta numerica e non la concatenazione di stringhe. La conversione ai valori numerici è esplicitamente menzionata:

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

(dove lprim e rprim sono le forme primitive del sinistro e l'argomento di destra, rispettivamente)

EcmaScript specifica anche la conversione To Number per booleani chiaramente:

L' il risultato è 1 se l'argomento è vero. Il risultato è +0 se l'argomento è falso.

Quindi, true + true significa efficacemente 1 + 1, o 2.

0

Javascript è un linguaggio digitato in modo dinamico, poiché non è necessario specificare il tipo di oggetto quando si avvia, ad esempio bool x o int i. Quando vede un'operazione che non può essere realmente eseguita, converte gli operandi in qualsiasi cosa essi debbano essere in modo che possano far eseguire l'operazione su di essi. Questo è noto come tipo coercizione. Non puoi aggiungere booleani, quindi Javascript invierà i booleani a qualcosa che può aggiungere, qualcosa come una stringa o un numero. In questo caso, ha senso lanciarlo su un numero poiché 1 è spesso usato per rappresentare true e 0 per false. Quindi Javascript eseguirà il cast di true su 1 s e li sommerà