Al mirar un código fuente en línea, encontré esto en la parte superior de varios archivos fuente.
var FOO = FOO || {};
FOO.Bar = …;
Pero no tengo ni idea de lo que || {}hace.
Sé que {}es igual a new Object()y creo que ||es para algo como "si ya existe, use su valor, de lo contrario, use el nuevo objeto.
¿Por qué debería ver esto en la parte superior de un archivo fuente?
javascript
namespaces
variable-declaration
or-operator
Ricardo Sánchez
fuente
fuente

Respuestas:
Tu suposición en cuanto a la intención de
|| {}está bastante cerca.Este patrón particular, cuando se ve en la parte superior de los archivos, se utiliza 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:
y
ambos comparten el mismo espacio de nombres, entonces no importa en qué orden se carguen los dos archivos, todavía se obtiene
func1yfunc2se define correctamente dentro delMY_NAMESPACEobjeto correctamente.El primer archivo cargado creará el
MY_NAMESPACEobjeto inicial y cualquier archivo cargado posteriormente aumentará el objeto.De manera útil, esto también permite la carga asincrónica de scripts que comparten el mismo espacio de nombres, lo que puede mejorar los tiempos de carga de la página. Si las
<script>etiquetas tienen eldeferatributo establecido, no puede saber en qué orden se interpretarán, por lo que, como se describió anteriormente, esto también soluciona ese problema.fuente
||también es realmente útil cuando desea proporcionar argumentos opcionales e inicializarlos a los valores predeterminados si no se proporcionan:function foo(arg1, optarg1, optarg2) { optarg1 = optarg1 || 'default value 1'; optarg2 = optart2 || 'defalt value 2';}||operador no puede decirundefineda partirfalsey.Básicamente, esta línea dice establecer la
AEROTWISTvariable en el valor de laAEROTWISTvariable, o establecerlo en un objeto vacío.El conducto doble
||es una instrucción OR, y la segunda parte de OR solo se ejecuta si la primera parte devuelve falso.Por lo tanto, si
AEROTWISTya tiene un valor, se mantendrá como ese valor, pero si no se ha establecido antes, se establecerá como un objeto vacío.es básicamente lo mismo que decir esto:
Espero que ayude.
fuente
Otro uso común de || es establecer un valor predeterminado para un parámetro de función no definido también:
El equivalente en otra programación suele ser:
fuente
varfrentea,amás entrar contexto de ejecución de la función como un parámetro formal , por lo que ya está declarada.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 dar lugar al caso de que alguien ya haya definidoFOOy asignado una funcionalidad (como unaskateboardfunción). Entonces lo anularía, si no estuviera comprobando si ya existe.Caso problemático:
En este caso, la
skateboardfunción desaparecerá si carga el archivo JavaScripthomer.jsdespuésbart.jsen su HTML porque Homer define un nuevoFOOobjeto (y por lo tanto anula el existente de Bart), por lo que solo conoce ladonutfunción.Por lo tanto, debe usar lo
var FOO = FOO || {};que significa "FOO se asignará a FOO (si ya existe) o un nuevo objeto en blanco (si FOO aún no existe).Solución:
Debido a que Bart y Homer ahora están verificando la existencia de
FOOantes de definir sus métodos, puede cargarbart.jsyhomer.jsen cualquier orden sin anular los métodos del otro (si tienen nombres diferentes). Por lo tanto, siempre obtendrá unFOOobjeto que tenga los métodosskateboardydonut(¡Yay!).# 2 Definiendo un nuevo objeto
Si ha leído el primer ejemplo, entonces ya sabe cuál es el propósito de
|| {}.Porque si no hay un
FOOobjeto existente, entonces el caso OR se activará y creará un nuevo objeto, por lo que puede asignarle funciones. Me gusta:fuente
Si no hay valor en AEROTWIST o es nulo o indefinido, el valor asignado al nuevo AEROTWIST será {} (un objeto en blanco)
fuente
El
||operador toma dos valores:Si a es veraz , volverá
a. De lo contrario, volveráb.Los valores son Falsy
null,undefined,0,"",NaNyfalse. Los valores de verdad son todo lo demás.Entonces, si
ano se ha configurado (esundefined), regresaráb.fuente
||JS (y Perl) y la versión en C, C ++ y Java es que JS no convierte el resultado en un booleano. Sigue siendo un operador lógico.Tenga en cuenta que en alguna versión de IE este código no funcionará como se esperaba. Debido a que
var, la variable se redefine y se asigna, por lo que, si recuerdo correctamente el problema, terminará teniendo siempre un objeto nuevo. Eso debería solucionar el problema:fuente