2014-04-14 17 views

risposta

23

Essi non sono affatto uguali.

if (x) 

controlla se x è Truthy dove, come i controlli successivi se il valore booleano x è true.

Ad esempio,

var x = {}; 
if (x) { 
    console.log("Truthy"); 
} 
if (x == true) { 
    console.log("Equal to true"); 
} 

Non solo un oggetto, qualsiasi stringa (eccetto una stringa vuota), qualsiasi numero (eccetto 0 (perché 0 è Falsy) e 1) sarà considerata come Truthy, ma non sarà uguale al vero.

Come da ECMA 5.1 Standards, in if (x), truthiness di x sarà deciso, come da tabella seguente

+-----------------------------------------------------------------------+ 
| Argument Type | Result            | 
|:--------------|------------------------------------------------------:| 
| Undefined  | false             | 
|---------------|-------------------------------------------------------| 
| Null   | false             | 
|---------------|-------------------------------------------------------| 
| Boolean  | The result equals the input argument (no conversion). | 
|---------------|-------------------------------------------------------| 
| Number  | The result is false if the argument is +0, −0, or NaN;| 
|    | otherwise the result is true.       | 
|---------------|-------------------------------------------------------| 
| String  | The result is false if the argument is the empty  | 
|    | String (its length is zero); otherwise the result is | 
|    | true.             | 
|---------------|-------------------------------------------------------| 
| Object  | true             | 
+-----------------------------------------------------------------------+ 

Nota: L'ultima riga object, che comprende entrambi gli oggetti e array.

Ma in quest'ultimo caso, come per The Abstract Equality Comparison Algorithm,

If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y. 
If Type(y) is Boolean, return the result of the comparison x == ToNumber(y). 

valore x viene convertito in un numero e questo numero sarà controllato contro true.

Nota:

In JavaScript, true è 1 e false è 0.

console.log(1 == true); 
# true 
console.log(0 == false); 
# true 
+0

Significa che la successiva può usare una stringa, un'altra di tipo booleano? –

+1

'var x = 'a'; se (x) avviso ("X"); se (x == true) alert ("X true"); 'Questo avviserà solo" X "' e non '" X true "' – peirix

+1

1 è considerato vero (da ECMA 5.1: Il risultato è falso se l'argomento è +0, -0 o NaN, altrimenti il ​​risultato è true) –

0

Diversi casi restituiscono false nel primo modulo, ad esempio stringa vuota, 0, non definito, null.

Se si vuole essere un po 'più semantica su di esso, provare il bang bang di fronte l'espressione:

if(!!x){...} 

questo sarà convertire il risultato dell'espressione a un truthy che rappresenta lo stesso semanticamente. Questo è più vicino a un analogo all'espressione di descrivere (x == true)

inoltre presente che == è comparions valore con tipo coercizione, ad esempio "3" == 3, mentre === afferma uguale digitazione troppo.

Quindi non sono gli stessi, ma spesso rappresentano lo stesso test logicamente, grazie alla semantica del linguaggio e del !!puoi usare

+0

Grazie. "if (!! x)" è sempre uguale a "if (x)"? – TheZver

+0

No no, immagina questo caso se (!! "ciao") e se ("ciao" == true), la prima espressione verrà valutata true perché "ciao" non è una stringa vuota, indefinita o nulla, ecc. vero, è vero. Considerando che la seconda espressione sarà falsa, perché "ciao" non può essere forzato per uguagliare il valore vero. http://jsfiddle.net/CEtN5/ – ComethTheNerd

+0

Scusa se ho avuto un errore nella domanda. Intendevo il confronto con if (x) – TheZver