0 == false
e '0' == false
sono entrambi 'vero'0 vs '0' con gli operatori booleani
Tuttavia, (true && 0)
è 'falsa', mentre (true && '0')
è 'vero'.
Perché?
0 == false
e '0' == false
sono entrambi 'vero'0 vs '0' con gli operatori booleani
Tuttavia, (true && 0)
è 'falsa', mentre (true && '0')
è 'vero'.
Perché?
Il comparatore abstract (==
) regole sono descritte nelle ES5 11.9.3 mentre le regole per operatori logici (&&
) sono descritti in ES5 11.11.
In breve, ==
è solo più complesso di &&
. Dove &&
utilizza solo l'interno ToBoolean()
per valutare i suoi operandi, ==
ha varie condizioni che possono comportare l'uso di ToBoolean()
, ToNumber()
e/o ToPrimitive()
.
(0 == false) == true
:
7. Se il tipo (y) è booleano, restituiscono il risultato del confronto x == ToNumber (y)
ToNumber(false) === 0
, così 0 == 0
, così true
.
('0' == false) == true
:
Questo passa anche attraverso il passaggio 7, con conseguente '0' == 0
.
Poi, ricominciando in alto, si raggiunge il passaggio 5:
5. Se il tipo (x) è String e tipo (y) è il numero, restituire il risultato del confronto ToNumber (x) == y.
ToNumber('0') === 0
, in modo nuovo 0 == 0
, e ancora true
.
!!(true && 0) == false
&&
restituisce semplicemente il 1 ° operando se è falsy (ToBoolean(...) === false
), o il 2 ° operando.
È rigorosamente (true && 0) === 0
.
E, se utilizzato come condizione if
, il risultato (0
) sarà anche passed through ToBoolean(...)
e ToBoolean(0) === false
.
!!(true && '0') == true
Ancora una volta, questo restituisce il 2 ° operando, '0'
.
Questa volta, tuttavia, come ToBoolean('0') === true
'0'
è una stringa non vuoto, rendendo truthy.
Inoltre, se si desidera che le regole di confronto più semplici, utilizzare rigoroso confronto (===
, 11.9.6).
'(true && '0') == true' è falso in realtà (come' ' 0 '! = True'). Se si desidera enfatizzare la veridicità e l'operazione 'ToBoolean' è meglio usare' !! (true && '0') ' – Bergi
'0' (o qualsiasi stringa non vuota) è 'verità' in JS. L'operatore ==, tuttavia, fa una strana coercizione di tipo ed è per questo che molte figure di spicco del JS, incluso Crockford, lo scoraggiano molto. Questo è un buon esempio del perché dovresti evitarlo, prende la stringa '0' e la costringe in un valore di falsa.
Ecco un link che spiega questo processo:
http://webreflection.blogspot.com/2010/10/javascript-coercion-demystified.html
If Type(x) is Boolean, return the result of the comparison
ToNumber(x) == y: false == 0 and true == 1 but true != 2
Quindi ancora più strano che il vostro esempio è questo:
('1' == true) // true
('2' == true) // false!
Au contraire mon ami, è assolutamente correlato a == e al suo effetto coercitivo. Non ho mai menzionato === quindi non so da dove viene il tuo commento. –
Gli operandi di un confronto di uguaglianza seguono alcune regole. Con i tuoi primi due esempi, vengono convertiti in numeri e quindi uguali. Usando '&&' e '||', gli operandi sono testati per la verità. Gli unici valori di falso sono 'false',' 0', '" "', 'null',' indefinito', e 'NaN'. Spero che questo possa aiutare: http://es5.github.io/#x11.9.3 – Ian
idk su di te ma quando digito '(true && 0)' nella console ottengo '0' e quando lo faccio' (true && '0') 'Ottengo' "0" ' – aug
@aug Penso che fossero più o meno utilizzati in una istruzione' if' – Ian