2010-12-31 14 views
10

Per quanto ne so in JavaScript !! si suppone che normalizzi un valore booleano convertendolo in vero o falso da un altro tipo. Ciò significherebbe che lo "0" si converte in vero booleano. D'altra parte se lo paragono con il falso risulta che è in realtà falso (come il risultato del confronto è vero). Che regola mi manca qui. L'ho provato in IE e Opera.Perché l'avviso (!! "0") e l'avviso (falso == "0") sono entrambi veri in JavaScript

+0

possibile duplicato di [Differenza tra Boolan (! X) e Booleano (x == 0)?] (Http://stackoverflow.com/questions/4280344/difference-between-boolanx-and-booleanx-0/4280356 # 4280356) – SLaks

risposta

10

L'operatore == controlla l'uguaglianza libera, che non ha nulla a che vedere con la verità.

In particolare, converte in operandi in numeri, quindi confronta i numeri.
Le stringhe contenenti numeri convertono in numeri che contengono; i booleani convertono in 0 e 1.
Gli oggetti vengono convertiti chiamando valueOf, se definito.

Così, tutta la seguente condizione:

  • "1" == 1
  • "0" == false
  • "1" == true
  • "2" != true
  • "2" != false
  • ({ valueOf:function() { return 2; } }) == 2
  • ({ valueOf:function() { return 1; } }) == true
+3

infatti, o in sintesi, "questa merda è wack" – Claudiu

9

Nel primo caso, una stringa non vuota equivale a true.

Nel secondo caso, poiché un operando è un valore booleano, entrambi gli operandi vengono convertiti in valori numerici. Credo che false converta al valore numerico 0 e che la stringa "0" converta anche in un numero 0, risultante in 0 == 0 che è vero.

Controllare il Mozilla reference per il comportamento dell'operatore.

+0

Grazie per il commento sulla mia risposta, questo ha molto senso. Buona pesca! +1 per te, buon signore. – wsanville

2

Per la prima espressione, punto 9.2 ECMA-262 definisce una ToBoolean operazione astratta utilizzato internamente dal NOT logico. Dice:

stringa
Il risultato è falso se l'argomento è la stringa vuota (la sua lunghezza è zero); altrimenti il ​​risultato è vero.

Per la seconda espressione, JavaScript eseguirà la coercizione di tipo quando tenta di confrontare questi valori di diversi tipi di dati. Douglas Crockford dice che this is a misfeature. Sarebbe falso se avessi usato === invece di ==. Le regole sono piuttosto complesse, quindi per i dettagli è necessario consultare direttamente la sezione 11.9.3 dell'ECMA-262.