2011-06-17 5 views
5
<script> 
    function f(){ 
     var t=document.getElementById("t"); 
     var g=t.asdfg; 
     var a=new Date().getTime(); 
     for(var x=0;x<100000000;++x){ 
      if(g===undefined); 
      //if(g); 
     } 
     var b=new Date().getTime(); 
     alert(b-a); 
    } 
</script> 
<body onload="f();"> 
    <input id="t"/> 
</body> 

dans Firefox if(g) est plus lent que if(g===undefined). Je me demande si quelqu'un sait une bonne explication pourquoi c'est le cas?profilage `si (x)` `VS si (x === défini)`

dans Chrome if(g) est plus rapide que if(g===undefined). Je me demande si quelqu'un sait une bonne explication pourquoi c'est le cas?

Je ne prétends pas que nous devrions utiliser un sur l'autre .. Je suis intéressé par la théorie

navigateurs différents ont peut dire différentes implémentations, mais toute théorie sur un navigateur serait digne d'une réponse

+0

Pour les benchmarks comme celui-ci, vous pouvez utiliser http://jsperf.com/ (je ne suis pas affilié, juste un fan). – Giacomo

Répondre

6

Il n'y a pas de mot-clé undefined en javascript, cela ne fonctionne pas comme null.

Lorsque vous utilisez

if(g===undefined) 

undefined sera analysé comme un identifiant. Par conséquent, l'interpréteur doit vérifier l'existence de la variable undefined dans la portée globale (fenêtre). Cette recherche prend du temps.

à mon humble avis, la façon plus correcte pour vérifier undefinedness est (mais pas nécessairement plus rapide)

if(typeof(g) === 'undefined') 

D'autre part, l'expression if(g) est très probablement mis en œuvre comme une distribution implicite à un booléen, ce qui bien sûr prend aussi du temps.

Donc, je suppose que ces deux opérations différentes ne sont pas aussi rapides dans les moteurs Firefox et Chrome.

+0

avec un profilage je crois que l'opérateur 'typeof' n'est pas très rapide aussi. juste mon 2c – Pacerier

+0

D'accord. Le problème principal avec la performance de typeof est probablement la comparaison de chaînes –

+0

euh en fait, mon point était l'opérateur 'typeof' n'est pas très rapide = est lent. La comparaison de chaînes dépend beaucoup de la longueur de la chaîne. Puisque "undefined" est une chaîne assez courte, l'opérateur 'typeof' a certainement plus de frais généraux ici. IE/FF/Chrome (le top 3 des navigateurs) m'a prouvé juste pour être juste, Opera/Safari m'a prouvé le contraire. et oui cela n'a rien à voir avec la question. – Pacerier

Questions connexes