2016-02-21 2 views
0

La plupart des fois que j'utilise quelque chose comme ceci:Comment vaut mieux vérifier l'objet paramètres en javascript?

function(obj) { 
    obj = obj || {}; 
    // do stuff 
    var foo = obj.foo; 
} 

Mais mes collègues joué un peu avec console.time/timeEnd et m'a assuré que

if (obj) 
    var foo = obj.foo; 

est plus rapide (code peut être plus compliqué , c'est seulement un exemple).

Mais, quant à moi, la 1ère variante est meilleure. Mais nous avons créé un objet vide supplémentaire à chaque fois (quand aucun paramètre n'est passé). Je voudrais entendre ce que vous pensez que les gars. Quelle méthode utilisez-vous?

+0

Ni l'un ni l'autre? Que faire si 'obj === 1'? – theonlygusti

+0

Dépend de ce que vous voulez 'obj' à maintenir après l'instruction. – Bergi

+1

Ne pas [optimiser prématurément] (https://en.wikipedia.org/wiki/Premature_optimisation). Toute différence, le cas échéant, sera négligeable. Utilisez des idiomes standards et concentrez-vous sur la lisibilité. – Bergi

Répondre

1

La première méthode est appropriée lorsque vous avez besoin d'un objet valide dans obj pour le reste de votre code et que vous voulez vous assurer qu'il existe un objet valide dans un seul endroit dans le code.

La deuxième méthode est appropriée lorsque vous voulez simplement vérifier si obj a été transmise ou non et faire quelque chose de différent dans votre code en fonction de cette condition. Une vérification plus robuste serait:

if (typeof obj === "object") 

Donc, ce sont des techniques différentes qui accomplissent des objectifs différents et qui sont principalement utilisées dans des circonstances différentes. Donc, la réponse est que «cela dépend de ce que fait le reste de votre code et de ce que vous essayez vraiment d'accomplir dans votre code». Il n'y a pas une seule réponse qui soit toujours correcte.

Un modèle de conception commun pour votre première technique est utilisée lorsque vous avez un objet en option avec des propriétés en option et que vous voulez remplir les valeurs par défaut des propriétés manquantes ou même si l'objet entier n'a pas été adopté:

function doSomething(obj) { 
    var defaults = {timeout: 2000, caseSensitive: false, waitTime: 400}; 
    var options = Object.assign({}, defaults, obj); 

    // safely use options object in the rest of this function 
} 

Cette technique fonctionne également en toute sécurité sur une copie de l'objet transmis afin que l'objet appelant ne soit jamais modifié.

0

Je recommanderais d'utiliser la seconde méthode pour vérifier si l'objet est défini ou non. Une meilleure façon serait de vérifier l'objet que je pense est

if(typeof object !== undefined) 

car il donne une compréhension claire de ce que nous essayons de faire dans le cas bloc

1

La première est plus lente parce que si obj manque il va passer par la création d'un objet. Le second fait juste un chèque et une assignation donc ce sera plus rapide mais vous n'aurez pas la présence de obj. Si jamais vous dépendez de la présence de obj alors utilisez le premier, si vous venez de vous référer à foo puis utilisez le second.

Cependant ... en toute honnêteté, vous ne devriez pas vous inquiéter de ces optimisations, faites plutôt ce que vous jugez plus clair et plus facile à lire.