¿Qué significa "var FOO = FOO / / {}" (asignar una variable o un objeto vacío a esa variable) en Javascript?


Mirando un código fuente en línea me encontré con esto en la parte superior de varios archivos fuente.

var FOO = FOO || {};
FOO.Bar = …;

Pero no tengo idea de lo que || {} hace.

Sé que {} es igual a new Object() y creo que el || es para algo así como "si ya existe use su valor o use el nuevo objeto.

¿Por qué vería esto en la parte superior de un archivo fuente?

Author: JJJ, 2011-06-22

7 answers

Su conjetura en cuanto a la intención de || {} es bastante cercana.

Este patrón particular cuando se ve en la parte superior de los archivos se usa para crear un espacio de nombres , es decir, un objeto con nombre bajo el cual se pueden crear funciones y variables sin contaminar indebidamente el objeto global.

La razón por la que se usa es para que si tiene dos (o más) archivos:

var MY_NAMESPACE = MY_NAMESPACE || {};
MY_NAMESPACE.func1 = {
}

Y

var MY_NAMESPACE = MY_NAMESPACE || {};
MY_NAMESPACE.func2 = {
}

Ambos comparten el mismo espacio de nombres, entonces no importa en qué orden los dos archivos están cargados, usted todavía obtiene func1 y func2 correctamente definidos dentro del objeto MY_NAMESPACE correctamente.

El primer archivo cargado creará el objeto MY_NAMESPACE inicial, y cualquier archivo cargado posteriormente aumentará el objeto.

Útilmente, esto también permite carga asíncrona de scripts que comparten el mismo espacio de nombres, lo que puede mejorar los tiempos de carga de la página. Si las etiquetas <script> tienen el atributo defer no se puede saber en qué orden se interpretarán, por lo que como se describió anteriormente, esto soluciona ese problema también.

 142
Author: Alnitak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-23 07:23:02
var AEROTWIST = AEROTWIST || {};

Básicamente esta línea dice establecer la variable AEROTWIST al valor de la variable AEROTWIST, o establecerla en un objeto vacío.

La tubería doble || es una instrucción OR, y la segunda parte del OR solo se ejecuta si la primera parte devuelve false.

Por lo tanto, si AEROTWIST ya tiene un valor, se mantendrá como ese valor, pero si no se ha establecido antes, entonces se establecerá como un objeto vacío.

Es básicamente lo mismo que decir esto:

if(!AEROTWIST) {var AEROTWIST={};}

Esperanza eso ayuda.

 20
Author: Spudley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-22 12:15:09

Otro uso común para | / es establecer un valor predeterminado para un parámetro de función indefinido también:

function display(a) {
  a = a || 'default'; // here we set the default value of a to be 'default'
  console.log(a);
}

// we call display without providing a parameter
display(); // this will log 'default'
display('test'); // this will log 'test' to the console

El equivalente en otra programación generalmente es:

function display(a = 'default') {
  // ...
}
 5
Author: alessioalex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-10 19:01:54

Hay dos partes principales que var FOO = FOO || {}; cubre.

#1 Prevención de anulaciones

Imagine que tiene su código dividido en varios archivos y sus compañeros de trabajo también están trabajando en un Objeto llamado FOO. Entonces podría llevar al caso de que alguien ya definiera FOO y le asignara funcionalidad (como una función skateboard). Entonces lo anularía, si no estuviera comprobando si ya existe.

Caso problemático:

// Definition of co-worker "Bart" in "bart.js"
var FOO = {};

FOO.skateboard = function() {
  alert('I like skateboarding!');
};

// Definition of co-worker "Homer" in "homer.js"
var FOO = {};

FOO.donut = function() {
  alert('I like donuts!');
};

En en este caso, la función skateboard desaparecerá si carga el archivo JavaScript homer.js después de bart.js en su HTML porque Homer define un nuevo objeto FOO (y por lo tanto anula el existente de Bart) para que solo conozca la función donut.

Así que necesitas usar var FOO = FOO || {}; que significa "FOO se asignará a FOO (si ya existe) o a un nuevo objeto en blanco (si FOO no existe ya).

Solución:

var FOO = FOO || {};

// Definition of co-worker Bart in bart.js
FOO.skateboard = function() {
  alert('I like skateboarding!');
};

// Definition of co-worker Homer in homer.js
var FOO = FOO || {};

FOO.donut = function() {
  alert('I like donuts!');
};

Porque Bart y Homer ahora están buscando la existencia de FOO antes de que definan sus métodos, puede cargar bart.js y homer.js en cualquier orden sin sobrescribir los métodos de cada uno (si tienen nombres diferentes). Así que siempre obtendrás un objeto FOO que tiene los métodos skateboard y donut (¡Yay!).

#2 Definiendo un nuevo objeto

Si has leído el primer ejemplo, entonces ya sabes cuál es el propósito del || {}.

Porque si no existe un objeto FOO entonces el OR-case se convertirá activa y crea un nuevo objeto, para que pueda asignarle funciones. Como:

var FOO = {};

FOO.skateboard = function() {
  alert('I like skateboarding!');
};
 4
Author: Benny Neugebauer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-21 15:14:18

Si no hay ningún valor en AEROTWIST o es nulo o indefinido, el valor asignado al nuevo AEROTWIST será {} (un objeto en blanco)

 3
Author: sudipto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-22 12:13:07

El operador || toma dos valores:

a || b

Si a es verdadero, volverá a. De lo contrario, volverá b.

El falsy valores son null, undefined, 0, "", NaN y false. Los valores de verdad son todo lo demás.

Así que si a no se ha establecido (es undefined) volverá b.

 1
Author: pimvdb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-22 12:15:00

Observe que en alguna versión de IE este código no funcionará como se espera. Debido a que el var, la variable se redefine y asignado de modo – si recuerdo correctamente el problema – que va a terminar para tener siempre un nuevo objeto. Eso debería solucionar el problema:

var AEROTWIST;
AEROTWIST = AEROTWIST || {};
 -1
Author: ZER0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-14 12:21:19