O design da linguagem JavaScript não é rigoroso o suficiente, e muitos lugares cometem erros se você não tomar cuidado.
Por exemplo, considere as seguintes situações.
Agora, precisamos determinar se existe um objeto global myObj e, se não existe, declare -o. O algoritmo descrito na linguagem natural é o seguinte:
if (myobj não existe) {declarar myobj; }Você pode achar fácil escrever este código. Mas, de fato, as questões gramaticais que envolve são muito mais complicadas do que pensamos. Juriy Zaytsev apontou que existem mais de 50 maneiras de determinar se existe um objeto JavaScript. Somente quando os detalhes da implementação do idioma JavaScript são muito claros, eles podem ser distinguidos.
A primeira maneira de escrever
Com base em sua intuição, você pode pensar que pode escrever isso:
if (! myObj) {myobj = {}; }No entanto, se você executar esse código, o navegador lançará diretamente um erro do ReferenceError, fazendo com que a operação seja interrompida. O que está errado?
A propósito, quando a instrução IF determina se o MYOBJ está vazio, essa variável ainda não existe, portanto, um erro será relatado. Altere para o seguinte e ele será executado corretamente.
if (! myObj) {var myobj = {}; }Por que o erro não será relatado após adicionar um VAR? O Myobj já existe neste caso quando a declaração IF faz julgamentos?
Para responder a essa pergunta, você deve saber como o intérprete JavaScript funciona. A linguagem JavaScript é "analisar primeiro, executar mais tarde". A declaração variável é concluída durante a análise, portanto o código acima é realmente equivalente a:
var myobj; if (! myObj) {var myobj = {}; }Portanto, quando a declaração IF faz julgamentos, o MyOBJ existe, então não há erro. Este é o efeito "aprimoramento do código" do comando var. O intérprete JavaScript apenas "eleva as variáveis definidas pelo comando VAR e não funciona para variáveis que não usam o comando var e atribuem diretamente. É por isso que causará um erro se você não adicionar var.
A segunda maneira de escrever
Além do comando VAR, pode haver outra reescrita e você também pode obter o resultado correto:
if (! window.myobj) {myobj = {}; }A janela é o objeto de nível superior do JavaScript, e todas as variáveis globais são suas propriedades. Portanto, julgar se o MyOBJ está vazio é equivalente a julgar se o objeto da janela tem atributo myObj, para evitar o erro de reference eror, porque o myobj não é definido. No entanto, a partir da padronização do código, é melhor adicionar VAR à segunda linha:
if (! window.myobj) {var myobj = {}; }Ou escreva assim:
if (! window.myobj) {window.myobj = {}; }A terceira maneira de escrever
A desvantagem do método de escrita acima é que, em alguns ambientes operacionais (como V8 e rinoceronte), a janela pode não ser um objeto de nível superior. Então, considere reescrevê -lo como:
if (! this.myobj) {this.myobj = {}; }No nível variável global, essa palavra-chave sempre aponta para a variável de nível superior, para que possa ser independente de diferentes ambientes operacionais.
A quarta maneira de escrever
No entanto, a escrita acima é pouco legível, e o apontamento disso é variável e propenso a erros, por isso é ainda mais reescrito:
var global = this; if (! global.myobj) {global.myobj = {}; }É muito mais claro usar a variável personalizada global para representar o objeto de nível superior.
A quinta maneira de escrever
Você também pode usar o operador TIPOOF para determinar se o MYOBJ está definido.
if (typeof myObj == "indefinido") {var myobj = {}; }Este é o método mais amplamente usado para determinar se existe um objeto JavaScript.
A sexta maneira de escrever
Como o valor de Myobj é diretamente igual a indefinido no caso de definido, mas não atribuído, o método de escrita acima pode ser simplificado:
if (myObj == indefinido) {var myobj = {}; }Há dois lugares para observar aqui. Primeiro, as palavras -chave VAR na segunda linha não devem estar faltando, caso contrário, ocorrerá um erro de referência. Em segundo lugar, indefinido não pode ser adicionado com cotações únicas ou duplas, porque o tipo de dados de indefinição é comparado aqui, em vez da string "indefinida".
A sétima maneira de escrever
O método de escrita acima ainda é válido sob a condição de "comparação precisa" (===):
if (myObj === indefinido) {var myobj = {}; }A oitava maneira de escrever
De acordo com o design do idioma do JavaScript, indefinido == NULL, para que você também possa obter o resultado correto comparando se o MyOBJ é igual a NULL:
if (myobj == null) {var myobj = {}; }No entanto, embora o resultado da operação esteja correto, semanticamente, esse método de julgamento está errado e deve ser evitado. Como o NULL se refere a um objeto vazio que foi atribuído a NULL, ou seja, esse objeto é realmente valorizado, enquanto indefinido se refere a um objeto que não existe ou não tem atribuição. Portanto, você pode usar apenas o "Operador de comparação" (==) aqui e se você usar o "Operador de comparação exato" (===) aqui, receberá um erro.
A nona maneira de escrever
Você também pode usar o operador no IN para determinar se o MYOBJ é um atributo do objeto de nível superior:
if (! ('myobj' na janela)) {window.myobj = {}; }A décima maneira de escrever
Por fim, use o método HasownProperty para determinar se Myobj é uma propriedade do objeto de nível superior:
if (! this.hasownProperty ('myobj')) {this.myobj = {}; }Resumir
1. Se você determinar apenas se o objeto existe, é recomendável usar o quinto método de escrita.
2. Além de existir o objeto, também é necessário determinar se o objeto tem um valor nulo, é recomendável usar o primeiro método de escrita.
3. Salvo especificado de outra forma, todas as variáveis devem ser declaradas usando o comando var.
4. Para plataforma cruzada, é recomendável evitar o uso da janela para representar objetos de nível superior.
5. Na linguagem JavaScript, nula e indefinida são propensos a confusão. Nos casos em que ambos podem estar envolvidos, é recomendável usar o operador de "comparação exata" (===).
(sobre)
O exemplo simples acima de como julgar se existe um objeto JavaScript é todo o conteúdo que compartilhei com você. Espero que você possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.