Maison  >  Article  >  interface Web  >  Résumé des instances de méthode sur la façon dont javascript détermine l'existence d'un objet

Résumé des instances de méthode sur la façon dont javascript détermine l'existence d'un objet

伊谢尔伦
伊谢尔伦original
2017-07-26 11:35:471341parcourir

La conception du langage Javascript n'est pas assez rigoureuse, et des erreurs peuvent survenir à de nombreux endroits si vous n'y faites pas attention. Nous devons déterminer si un objet global myObj existe. S'il n'existe pas, déclarez-le. L'algorithme décrit en langage naturel est le suivant :

if (myObj不存在){ 
    声明myObj; 
  }

Vous pensez peut-être qu'écrire ce code est facile. Mais en réalité, les problèmes grammaticaux impliqués sont bien plus complexes qu’on ne l’imagine. Ce n'est que si vous êtes très clair sur les détails d'implémentation du langage Javascript que vous pourrez faire la différence entre eux.

La première façon d'écrire
Selon votre intuition, vous pensez peut-être que vous pouvez l'écrire comme ceci :

if (!myObj) { 
    myObj = { }; 
  }

Cependant, lorsque vous exécutez ce code , le navigateur lancera directement une erreur ReferenceError, provoquant l'interruption de l'opération. Qu'est-ce qui ne va pas?
D'ailleurs, lorsque l'instruction if détermine si myObj est vide, cette variable n'existe pas encore, donc une erreur est signalée. Modifiez-le comme suit et il fonctionnera correctement.

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

Pourquoi n'y a-t-il aucune erreur après l'ajout d'une variable ? Se pourrait-il que dans ce cas, lorsque l'instruction if porte un jugement, myObj existe déjà ?
Pour répondre à cette question, vous devez savoir comment fonctionne l'interpréteur Javascript. Le langage Javascript est "analyser d'abord, puis exécuter". La déclaration de variable a été terminée lors de l'analyse, donc le code ci-dessus est en fait équivalent à :

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

Par conséquent, lorsque l'instruction if émet un jugement, myObj existe déjà, donc aucune erreur n'est signalée. Il s’agit de l’effet « histing de code » de la commande var. L'interpréteur Javascript "promeut" uniquement les variables définies par la commande var et ne fonctionne pas sur les variables directement affectées sans utiliser la commande var. C'est pourquoi une erreur sera signalée si var n'est pas ajouté.

La deuxième façon d'écrire
En plus de la commande var, il existe une autre façon de la réécrire et d'obtenir le résultat correct :

if (!window.myObj) { 
    myObj = { }; 
  }

window est javascript L'objet de niveau supérieur, toutes les variables globales sont ses propriétés. Par conséquent, déterminer si myobj est vide équivaut à déterminer si l'objet window possède l'attribut myobj, de sorte que les erreurs ReferenceError qui se produisent parce que myObj n'est pas défini peuvent être évitées. Cependant, du fait de la standardisation du code, il est préférable d'ajouter var à la deuxième ligne :

if (!window.myObj) { 
    var myObj = { }; 
}

ou de l'écrire comme ceci :   

if (!window.myObj) { 
   window.myObj = { }; 
}

La troisième voie d'écriture
L'inconvénient de la méthode d'écriture ci-dessus est que dans certains environnements d'exécution (tels que V8, Rhino), window peut ne pas être un objet de niveau supérieur. Par conséquent, envisagez de le réécrire comme :

if (!this.myObj) { 
    this.myObj = { }; 
  }

Au niveau des variables globales, le mot-clé this pointe toujours vers la variable de niveau supérieur, afin qu'il puisse être indépendant des différents environnements d'exploitation.
La quatrième façon d'écrire
Cependant, la façon d'écrire ci-dessus est moins lisible, et le pointeur de celle-ci est variable et sujet aux erreurs, il est donc réécrit davantage :

var global = this; 
  if (!global.myObj) { 
    global.myObj = { }; 
  }

Ce sera beaucoup plus clair si vous utilisez la variable personnalisée global pour représenter l'objet de niveau supérieur.

La cinquième façon d'écrire
Vous pouvez également utiliser l'opérateur typeof pour déterminer si myObj est défini.

if (typeof myObj == "undefined") { 
    var myObj = { }; 
  }

Il s'agit actuellement de la méthode la plus utilisée pour déterminer si un objet JavaScript existe.

La sixième façon d'écrire
Puisque la valeur de myObj est directement égale à undefined lorsqu'elle est définie mais non assignée, la façon d'écrire ci-dessus peut être simplifiée :

if (myObj == undefined) { 
    var myObj = { }; 
  }

Il y a deux choses à noter ici. Premièrement, le mot-clé var dans la deuxième ligne ne peut pas manquer, sinon une ReferenceError se produira. Deuxièmement, undefined ne peut pas être ajouté avec des guillemets simples ou doubles, à cause du type de données. de non défini est comparé ici au lieu de la chaîne "undéfini".

La septième façon d'écrire
La façon d'écrire ci-dessus est toujours vraie dans le cas d'une "comparaison exacte" (===) :

if (myObj === undefined) { 
    var myObj = { }; 
  }

La huitième façon d'écrire
Selon la conception du langage javascript, undefined == null, donc comparer si myObj est égal à null peut également obtenir le résultat correct :

if (myObj == null) { 
    var myObj = { }; 
  }

Cependant, bien que le résultat de l'exécution soit correct, d'un point de vue sémantique, cette méthode de jugement est erronée et doit être évitée. Parce que null fait référence à un objet vide auquel a été attribué une valeur null, c'est-à-dire que cet objet a réellement une valeur, tandis qu'undéfini fait référence à un objet qui n'existe pas ou auquel aucune valeur n'est attribuée. Par conséquent, seul « l'opérateur de comparaison » (==) peut être utilisé ici. Si l'« opérateur de comparaison exact » (===) est utilisé ici, une erreur se produira.

La neuvième façon d'écrire
Vous pouvez également utiliser l'opérateur in pour déterminer si myObj est un attribut de l'objet de niveau supérieur :

if (!('myObj' in window)) { 
    window.myObj = { }; 
  }

La dixième voie Méthodes d'écriture
Enfin, utilisez la méthode hasOwnProperty pour déterminer si myObj est une propriété de l'objet de niveau supérieur :

if (!this.hasOwnProperty('myObj')) { 
    this.myObj = { }; 
  }

Résumé
1. Si vous déterminez uniquement si l'objet existe, il est recommandé d'utiliser la cinquième façon d'écrire.

2. Si en plus de savoir si l'objet existe, vous devez également déterminer si l'objet a une valeur nulle, il est recommandé d'utiliser la première façon d'écrire.

3. Sauf circonstances particulières, toutes les variables doivent être déclarées à l'aide de la commande var.

4. Afin d'être multiplateforme, il est recommandé d'éviter d'utiliser window pour représenter des objets de niveau supérieur.

5. En langage Javascript, null et indéfini se confondent facilement. Dans les cas où les deux peuvent être impliqués, il est recommandé d'utiliser l'opérateur "comparaison exacte" (===).

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn