2013-06-27 37 views
6

0 == false e '0' == false sono entrambi 'vero'0 vs '0' con gli operatori booleani

Tuttavia, (true && 0) è 'falsa', mentre (true && '0') è 'vero'.

Perché?

+8

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

+0

idk su di te ma quando digito '(true && 0)' nella console ottengo '0' e quando lo faccio' (true && '0') 'Ottengo' "0" ' – aug

+2

@aug Penso che fossero più o meno utilizzati in una istruzione' if' – Ian

risposta

6

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().

  1. (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 .

  2. ('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.

  3. !!(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.

  4. !!(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).

+1

'(true && '0') == true' è falso in realtà (come' ' 0 '! = True'). Se si desidera enfatizzare la veridicità e l'operazione 'ToBoolean' è meglio usare' !! (true && '0') ' – Bergi

-2

'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! 
+0

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. –