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
risposta
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
infatti, o in sintesi, "questa merda è wack" – Claudiu
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.
Grazie per il commento sulla mia risposta, questo ha molto senso. Buona pesca! +1 per te, buon signore. – wsanville
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.
- 1. Se entrambi [0] == 0 e 0 == [[0]] sono veri del perché è [0] == [[0]] falso?
- 2. Perché 0 == "" vero in JavaScript
- 3. Perché '0' è falso in Perl?
- 4. Perché -0 === 0 è vero?
- 5. Perché 0 === -0 è vero, ma 1/0 === 1/-0 è falso?
- 6. Perché 0 == [], ma 0 == false e! [] == false?
- 7. Perché {} + [] restituisce 0 in Javascript?
- 8. Perché è così !! 0 è falso e {} + [] è 0 ma !! ({} + []) è vero?
- 9. Come convertire "0" e "1" in falso e vero
- 10. Spiega perché '+ [] == 0' output 'true' in Javascript?
- 11. Perché 0 è vero ma falso è 1 nella shell?
- 12. Perché -0 esiste?
- 13. Perché 0 && 1 è 1 mentre 1 && 0 è 0 in ruby?
- 14. Perché 0 = 0,5?
- 15. Perché Number ([]) === 0 e Number ({}) === NaN in Javascript?
- 16. Cast di booleano PostgreSQL (0 come falso)
- 17. Perché systemLayoutSizeFittingSize restituisce (0, 0) per UITableViewCell?
- 18. perché uno usare MACRO + 0 = 0
- 19. (oggetto) 0 == (oggetto) 0
- 20. Perché InverseFunction [0 &] @ 0 restituisce 33/10?
- 21. Perché il risultato 2 + 1 e 0 è 0?
- 22. Perché javascript: void (0) è considerato dannoso?
- 23. Utilizzo di request.getRemoteAddr() restituisce 0: 0: 0: 0: 0: 0: 0: 1
- 24. # o javascript: void (0)?
- 25. Cosa significano "positivo" e "negativo" in ECMAScript? +0 e -0
- 26. Come unmarshall sia 0 e falso come bool da JSON
- 27. javascript: void (0) e target = "_ blank" comportamento
- 28. I file 0 byte sono veramente 0 byte?
- 29. Perché memset sockaddr_in a 0
- 30. Che cos'è% 0 |% 0 e come funziona?
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