J'ai des objets avec des propriétés. Je voulais tester pour voir s'ils avaient des personnages, alors j'ai d'abord écrit ceci:

if (MyObject.Prop1.length > 0) {....}

Cependant, parfois l'objet peut ne pas avoir une certaine propriété, donc j'obtenais l'erreur "impossible d'obtenir la longueur".

Je l'ai changé en écrivant ceci:

if (MyObject.Prop1 && MyObject.Prop1.length > 0) {....}

J'utilise l'inspecteur de chrome et lorsque j'exécute le code, je ne reçois plus l'erreur. Est-ce que cela fonctionnera dans tous les navigateurs?

Merci.

2
frenchie 8 déc. 2011 à 02:50

3 réponses

Meilleure réponse

Comme alternative:

if ('Prop1' in MyObject && MyObject.Prop1.length > 0) { ... )

Ou, pour être encore plus prudent:

if (MyObject.hasOwnProperty('Prop1') && MyObject.Prop1.length > 0) { ... }

Bien sûr, cela pourrait être la mauvaise chose à faire, selon la nature de "MyObject".

5
Pointy 7 déc. 2011 à 22:54

Oui, cela fonctionnera très bien, bien que vous puissiez vous épargner le > 0 et faire simplement

if (MyObject.Prop1 && MyObject.Prop1.length) {....}

Puisque tout autre chose que zéro sera évalué comme vrai.

2
Martin Jespersen 7 déc. 2011 à 22:54

Étant donné que undefined, 0 et "" sont tous "faux" en JavaScript, cela équivaut à:

if(MyObject.Prop1) {
  // ...
}

Le "JavaScript idiomatique" de Rick Waldron est une bonne référence pour simplifier les instructions conditionnelles sans sacrifier l'exactitude. Vous pouvez tester vous-même son utilisation:

function testProp(val) {
  if(val) {
    return val.length;
  }

  return "nope!";
}

var myObj = { stringProp   : "foo",
              emptyStrProp : "",
              // undefinedProp is not defined
              zeroProp     : 0,
              twelveProp   : 12,
              otherObjProp : document.createElement('div'),
              arrayProp    : [ 'a', 'b' ]
            };

console.log( testProp( myObj.stringProp    ) ); // => 3
console.log( testProp( myObj.emptyStrProp  ) ); // => "nope!"
console.log( testProp( myObj.undefinedProp ) ); // => "nope!"

// of course if you're expecting values other than strings and undefined
// you'll have to account for them

console.log( testProp( myObj.zeroProp      ) ); // => "nope!"
console.log( testProp( myObj.twelveProp    ) ); // => undefined
console.log( testProp( myObj.otherObjProp  ) ); // => undefined
console.log( testProp( myObj.arrayProp     ) ); // => 2
2
Jordan Running 7 déc. 2011 à 23:20
8423754