La técnica trata de hacer uso de algo que se llama short circuit evaluation ... pero es complicado en Javascript, y resulta ser muy peligroso si se intenta hacer uso de ella para la creación de instancias de objetos.
La teoría detrás de la evaluación de cortocircuitos es que una declaración O solo se evalúa hasta el primer valor true
. Por lo tanto, la segunda mitad de una declaración OR no se evalúa si la primera mitad es verdadera. Esto aplica a Javascript ......
Pero, las peculiaridades de Javascript, en particular cómo se manejan las variables no declaradas, hacen de esta una técnica que debe ser utilizada con sumo cuidado para crear instancias de objetos.
El siguiente código crea un objeto vacío, excepto si Obj fue declarado previamente en el mismo ámbito:
var Obj = Obj || {}; // Obj will now be {}, unless Obj was previously defined
// in this scope function.... that's not very useful...
Esto es porque después var Obj
, Obj
estarán indefinidos a menos que se declaró en el mismo ámbito (incluidos siendo declarado como un parámetro para la función, si lo hay) ... así que {}
será evaluado. (Link to an explanation of var en los comentarios de T.J. Crowder).
El siguiente código crea un objeto vacío sólo si Obj
ha sido declarado previamente y ahora es Falsy:
Obj = Obj || {}; // Better make sure Obj has been previously declared.
Si se utiliza la línea anterior, cuando Obj
no se ha declarado previamente, habrá una error de tiempo de ejecución, ¡y el script se detendrá!
Por ejemplo, esto Javascript no evaluará en absoluto:
(function() {
Obj = Obj || "no Obj"; // error since Obj is undeclared JS cannot read from
alert(Obj); // an undeclared variable. (declared variables CAN
})(); // be undefined.... for example "var Obj;" creates
// a declared but undefined variable. JS CAN try
// and read a declared but undefined variable)
jsFiddle example
Pero esto Javascript siempre establece la Obj
a "no Obj"!
var Obj ="I'm here!";
(function() {
var Obj = Obj || "no Obj"; // Obj becomes undefined after "var Obj"...
alert(Obj); // Output: "no Obj"
})();
jsFiddle example
Así que el uso de este tipo de evaluación de cortocircuito en Javascript es peligroso, ya que por lo general sólo se puede utilizar en forma
Obj = Obj || {};
Qué fallará precisamente cuando lo más deseable sería que funcione ... en el caso en que Obj no se declare.
Nota: que menciono esto en los comentarios de la penúltima ejemplo, pero es importante entender las 2 razones por las que una variable puede ser indefinido en Javascript.
- Una variable puede estar indefinida porque nunca fue declarada.
- Una variable no se puede definir porque se declaró pero no se le ha asignado un valor.
Una variable puede declararse utilizando la palabra clave var
. Asignar un valor a una variable no declarada crea la variable.
Intentar utilizar una variable indefinida que también no se declara provoca un error de tiempo de ejecución. Usar una variable indefinida que ha sido declarada es perfectamente legal. Esta diferencia es lo que hace que el uso de Obj = Obj || {};
sea tan complicado, ya que no existe una forma significativa de la declaración anterior si Obj
no está declarado O es una variable previamente existente.
similar al operador C# '??', pero javascript lo hace sin definir un nuevo operador. http://msdn.microsoft.com/en-us/library/ms173224.aspx – lincolnk