2011-06-17 11 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> 

en Firefox if(g) es más lento que if(g===undefined). Me pregunto si alguien sabe alguna buena explicación de por qué este es el caso.de perfiles `si (x)` `si VS (x === indefinido)`

en Chrome if(g) es más rápido que if(g===undefined). Me pregunto si alguien sabe alguna buena explicación de por qué este es el caso.

No estoy discutiendo que debemos usar uno sobre el otro .. yo soy sólo interesado en la teoría

navegadores Podría decirse que tienen diferentes implementaciones diferentes, pero ninguna teoría en cualquier navegador sería digna de una respuesta

+0

Para puntos de referencia como este, es posible que desee utilizar http://jsperf.com/ (No estoy afiliado, solo soy fanático). – Giacomo

Respuesta

6

No existe la palabra clave undefined en javascript, no funciona como null.

Cuando se utiliza

if(g===undefined) 

undefined será analizada como un identificador. Por lo tanto, el intérprete debe verificar la existencia de la variable undefined en el ámbito global (ventana). Esta búsqueda lleva algo de tiempo.

en mi humilde opinión, la forma más correcta para comprobar si hay indefinición es (aunque no necesariamente más rápido)

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

Por otro lado, la expresión if(g) más probable es implementado como una conversión implícita a un valor lógico, que de Por supuesto, también lleva algo de tiempo.

Así que mi conjetura es que estas dos operaciones diferentes no son igualmente rápidas en los motores Firefox y Chrome.

+0

con algunos perfiles, creo que el operador 'typeof' tampoco es muy rápido. solo mi 2c – Pacerier

+0

de acuerdo. El problema principal con el rendimiento de typeof es probablemente la comparación de cadenas –

+0

uh en realidad mi punto era que el operador 'typeof' no es muy rápido = es lento. La comparación de cuerdas depende mucho de la longitud de la cuerda. dado que "indefinido" es una cadena bastante corta, el operador 'typeof' definitivamente tiene más sobrecarga aquí. IE/FF/Chrome (los 3 mejores navegadores) me demostraron que era justo, Opera/Safari me demostró que estaba equivocado. y sí, esto no tiene nada que ver con la pregunta. – Pacerier

Cuestiones relacionadas