Olhando para um código-fonte online, encontrei isso no topo de vários arquivos-fonte.
var FOO = FOO || {};
FOO.Bar = …;
Mas não tenho ideia do que || {}
seja.
Eu sei que {}
é igual a new Object()
e acho que ||
é para algo como "se já existir use o valor, caso contrário, use o novo objeto.
Por que eu veria isso no topo de um arquivo de origem?
javascript
namespaces
variable-declaration
or-operator
Ricardo Sanchez
fonte
fonte
Respostas:
Seu palpite quanto à intenção de
|| {}
está bem próximo.Este padrão particular, quando visto no topo dos arquivos, é usado para criar um namespace , ou seja, um objeto nomeado sob o qual funções e variáveis podem ser criadas sem poluir indevidamente o objeto global.
O motivo pelo qual é usado é que, se você tiver dois (ou mais) arquivos:
e
ambos compartilham o mesmo namespace, então não importa a ordem em que os dois arquivos são carregados, você ainda obtém
func1
efunc2
define corretamente dentro doMY_NAMESPACE
objeto.O primeiro arquivo carregado criará o
MY_NAMESPACE
objeto inicial e qualquer arquivo carregado subsequentemente aumentará o objeto.De forma útil, isso também permite o carregamento assíncrono de scripts que compartilham o mesmo namespace, o que pode melhorar o tempo de carregamento da página. Se as
<script>
tags tiverem odefer
atributo definido, você não poderá saber em que ordem serão interpretadas, portanto, conforme descrito acima, isso também corrige o problema.fonte
||
também é muito útil quando você deseja fornecer argumentos opcionais e inicializá-los com os padrões se não forem fornecidos:function foo(arg1, optarg1, optarg2) { optarg1 = optarg1 || 'default value 1'; optarg2 = optart2 || 'defalt value 2';}
||
operador não pode dizerundefined
a partirfalsey
.Basicamente, esta linha diz para definir a
AEROTWIST
variável para o valor daAEROTWIST
variável ou para um objeto vazio.O pipe duplo
||
é uma instrução OR e a segunda parte do OR só é executada se a primeira parte retornar falso.Portanto, se
AEROTWIST
já tiver um valor, ele será mantido com esse valor, mas se não tiver sido definido antes, será definido como um objeto vazio.é basicamente o mesmo que dizer isto:
Espero que ajude.
fonte
Outro uso comum para || é definir um valor padrão para um parâmetro de função indefinido também:
O equivalente em outra programação geralmente é:
fonte
var
em frentea
,a
entra contexto de execução da função como um parâmetro formal , portanto, já está declarado.Existem duas partes principais que
var FOO = FOO || {};
cobrem.# 1 Prevenção de substituições
Imagine que você tem seu código dividido em vários arquivos e seus colegas de trabalho também estão trabalhando em um objeto chamado
FOO
. Então, isso pode levar ao caso de alguém já ter definidoFOO
e atribuído uma funcionalidade a ele (como umaskateboard
função). Em seguida, você o substituiria, se não estivesse verificando se ele já existe.Caso problemático:
Nesse caso, a
skateboard
função desaparecerá se você carregar o arquivo JavaScripthomer.js
depoisbart.js
em seu HTML, porque Homer define um novoFOO
objeto (e, portanto, substitui o existente de Bart), então ele só sabe sobre adonut
função.Portanto, você precisa usar o
var FOO = FOO || {};
que significa "FOO será atribuído a FOO (se já existir) ou um novo objeto em branco (se FOO ainda não existir).Solução:
Como Bart e Homer agora estão verificando a existência de
FOO
antes de definirem seus métodos, você pode carregarbart.js
ehomer.js
em qualquer ordem, sem substituir os métodos um do outro (se eles tiverem nomes diferentes). Assim, você sempre obterá umFOO
objeto que possui os métodosskateboard
edonut
(Yay!).# 2 Definindo um novo objeto
Se você leu o primeiro exemplo, então sabe qual é o propósito do
|| {}
.Porque se não houver nenhum
FOO
objeto existente , o caso OR se tornará ativo e criará um novo objeto, para que você possa atribuir funções a ele. Gostar:fonte
Se não houver valor em AEROTWIST ou for nulo ou indefinido, o valor atribuído ao novo AEROTWIST será {} (um objeto em branco)
fonte
O
||
operador assume dois valores:Se um for verdadeiro , ele retornará
a
. Caso contrário, ele retornaráb
.Os valores Falsas são
null
,undefined
,0
,""
,NaN
efalse
. Os valores verdadeiros são todo o resto.Portanto, se
a
não foi definido (éundefined
), ele retornaráb
.fonte
||
em JS (e Perl) e a versão em C, C ++ e Java é que JS não converte o resultado em um booleano. Ainda é um operador lógico.Observe que em algumas versões do IE este código não funcionará conforme o esperado. Porque
var
, a variável é redefinida e atribuída de forma - se bem me lembro do problema - você acabará sempre tendo um novo objeto. Isso deve resolver o problema:fonte