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
func1
yfunc2
se define correctamente dentro delMY_NAMESPACE
objeto correctamente.El primer archivo cargado creará el
MY_NAMESPACE
objeto 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 eldefer
atributo 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 decirundefined
a partirfalsey
.Básicamente, esta línea dice establecer la
AEROTWIST
variable en el valor de laAEROTWIST
variable, 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
AEROTWIST
ya 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
var
frentea
,a
má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 definidoFOO
y asignado una funcionalidad (como unaskateboard
función). Entonces lo anularía, si no estuviera comprobando si ya existe.Caso problemático:
En este caso, la
skateboard
función desaparecerá si carga el archivo JavaScripthomer.js
despuésbart.js
en su HTML porque Homer define un nuevoFOO
objeto (y por lo tanto anula el existente de Bart), por lo que solo conoce ladonut
funció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
FOO
antes de definir sus métodos, puede cargarbart.js
yhomer.js
en cualquier orden sin anular los métodos del otro (si tienen nombres diferentes). Por lo tanto, siempre obtendrá unFOO
objeto que tenga los métodosskateboard
ydonut
(¡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
FOO
objeto 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
,""
,NaN
yfalse
. Los valores de verdad son todo lo demás.Entonces, si
a
no 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