2010-07-09 21 views
7

He encontrado dos formas diferentes de definir/nombrar objetos y funciones en JavaScript que primero comprueban la existencia del nombre antes de usarlo. El problema es que no sé cuál es mejor (desde el punto de vista de la velocidad y la usabilidad) y es imposible usar los operadores booleanos en una búsqueda de Google para resolverlo.condicionales de definición de objeto JavaScript - ¿cuál es mejor?

El primero que veo con mayor frecuencia:

var myNewObject = myNewObject ? myNewObject : function() { 
    // Code goes here. 
}; 

El segundo parece más concisa, pero sólo he visto uno o dos lugares, así que no sé si hay una norma o incluso un nombre para él:

var myNewObject = myNewObject || function() { 
    // Code goes here. 
}; 

Funcionalmente, ambos hacen lo mismo y ambos parecen funcionar en todos los navegadores que puedo probar en Mi pregunta es - lo que es mejor y por qué.? Además, aunque la primera definición es esencialmente una línea condicional ... ¿a qué se llama el segundo?

+0

el segundo es más común. Al menos para las personas que conocen el idioma ... – galambalazs

+0

Genial, alguien sabe si esto funciona también con el prototipo: es decir, Array.prototype.forEach = Array.prototype.forEach || función (... lo estoy preguntando porque en el sitio web de Mozilla usan una función if (! Array.prototype.forEach) Array.prototype.forEach = (... –

+0

@Marco Demaio Siguiendo la misma lógica es * debería * funcionar Sugeriría que lo golpee en un script de prueba y vea si lo hace.Todavía estás definiendo un método de objeto ... ya está en un espacio de nombre específico. – EAMann

Respuesta

5

yo elegiría esta última aunque sólo sea por el hecho de que escriba myNewObject dos veces en lugar de tres veces.

Además, aunque la primera definición es esencialmente una línea condicional ... ¿a qué se llama la segunda?

Short-circuit evaluation

+2

Aceptando esto como la respuesta ya que también me dio el nombre del segundo enfoque. Me hubiera ahorrado tanto tiempo si hubiera sabido cómo se llamaba ... No sabía que era un enfoque legítimo, solo que parecía funcionar. – EAMann

1

FWIW Veo el segundo enfoque más seguido, y (por mi parte) siento que es más claro, conciso e idiomático.

5

Usaría el segundo ejemplo, que se describe como (Evaluación mínima). Es más simple y parece más legible.

Es como obtener un evento del método onClick en varios navegadores.

element.onclick = function (evt) { 
    evt = evt || window.event 
} 
+1

+1 para el ejemplo – galambalazs

2

Este último, es similares al operador nulo coalesce en C# ?? cuando se usa de esa manera

véase: Is there a "null coalescing" operator in JavaScript?

+1

Tenga en cuenta que no es completamente equivalente, '??' en C# devolverá el valor predeterminado solo cuando su valor de operando izquierdo sea 'nulo', en JavaScript' || 'lo hará cuando su primer operando sea * falsy *, falsy los valores son: 'null',' undefined', '0',' NaN', cadena vacía y 'false'. – CMS

+0

@CMS, sí, de ahí el enlace para aclaración. Debería haber escrito que es * similar * al operador '??' – CaffGeek

0

Ambos métodos de trabajo. pero creo que la versión más optimizada es usar simplemente una normal si prueba como:

if(!myNewObject) 
    myNewObject = ... 

hacer en cualquiera del método que sugiere en su respuesta, que podría implicar una reasignación innecesaria cada vez que la función/objeto ya está definido. Me refiero a si myNewObject ya está definido, el tiempo de ejecución de JavaScript tendría que realizar una reasignación innecesaria myNewObject = myNewObject (a menos que el tiempo de ejecución no lo optimice).

En el sitio web de Mozilla sugieren utilizar un simple si, view this.

Cuestiones relacionadas