2010-01-19 8 views
2
var c = false; 
if(c=[] && c.length==0)alert('hi'); 

salut n'est pas parce que c est alertée toujours faux quand il exécute le second opérande de & &, quelqu'un peut-il expliquer comment les opérandes booléens dans si la condition sont exécutées et dans quel ordre?javascript ordre d'exécution

Répondre

3

Je crois que c'est juste un problème de précédence - && est plus contraignant que =. Votre code est équivalent à:

if (c = ([] && c.length == 0)) 
{ 
    alert('hi'); 
} 

Il est donc attribuer c la valeur false plutôt que le tableau vide.

Essayez ceci:

if ((c = []) && c.length == 0) 
{ 
    alert('hi'); 
} 

EDIT: Pour répondre à la remarque de Triptyque - Je l'ai fait essayer avant de poster :) Comme CMS dit, un tableau vide est considéré comme vrai. Essayez ceci:

if (c = []) 
{ 
    alert('empty array is true'); 
} 

ou même ceci:

if ([]) 
{ 
    alert('empty array is true'); 
} 

J'ai vérifié la spécification avant de poster - j'été un peu surpris qu'un tableau vide est considéré comme vrai, mais il est ...

+1

L'alerte ne s'exécuterait toujours pas dans votre deuxième exemple, car en Javascript un tableau vide est une valeur de type faux. ('[] == false') est vrai. – Triptych

+1

Triptych: Un tableau vide n'est pas considéré comme une valeur fausse, votre exemple est un * quirk * de l'opérateur égal, essayez: '!! [] == true;', '! [] == false;', '[] == false;' – CMS

+0

Bon edit Jon, BTW * tout * sauf, 'undefined',' null', 'NaN',' 0', une chaîne vide (et bien sûr 'false') évalue' ' true' dans une expression booléenne. – CMS