172 votes

JavaScript - Impossible de définir une propriété non définie

Mon code :

var a = "1",
b = "hello",
c = { "100" : "some important data" },
d = {};

d[a]["greeting"] = b;
d[a]["data"] = c;

console.debug (d);

Je reçois l'erreur suivante :

Erreur de Type Non Rattrapée : Cannot set property 'greeting' of undefined.

J'essaie de faire quelque chose de similaire à un tableau associatif. Pourquoi cela ne fonctionne-t-il pas ?

2 votes

D[a] est indéfini. En fait, d["1"] est indéfini.

240voto

zzzzBov Points 62084

Tu n'as jamais mis d[a] à n'importe quelle valeur.

A cause de ça, d[a] évalue à undefined et vous ne pouvez pas définir de propriétés sur undefined .

Si vous ajoutez d[a] = {} juste après d = {} les choses devraient fonctionner comme prévu.

Vous pouvez également utiliser un initialisateur d'objet :

d[a] = {
    greetings: b,
    data: c
};

Ou vous pouvez définir toutes les propriétés de d dans une instance de fonction anonyme :

d = new function () {
    this[a] = {
        greetings: b,
        data: c
    };
};

Si vous êtes dans un environnement qui supporte les fonctionnalités de ES2015, vous pouvez utiliser noms des propriétés calculées :

d = {
  [a]: {
    greetings: b,
    data: c
  }
};

0 votes

Cela fonctionne. Le modèle devrait être : d = { [a] : { salutations : b, données : c } }

1 votes

@robertjewell, bon point, j'ai mis à jour pour inclure la note sur la notation ES2015.

42voto

vol7ron Points 11270

Vous devez définir d[a] soit un tableau associatif, soit un objet :

  • d[a] = [];
  • d[a] = {};

Sans cadre, c'est ce qui se passe :

d[a] == undefined donc vous faites undefined['greeting']=b; et par définition, l'indéfini n'a pas de propriétés. Ainsi, l'erreur que vous avez reçue.

0 votes

array o object . JS n'a pas de tableaux associatifs, cependant Object peut agir comme tel pour des utilisations limitées.

0 votes

@JeremyJStarcher : tout à fait correct et important à savoir, mais à ce niveau de pensée, JavaScript n'a pas de tableaux ; il n'a que des objets.

0 votes

Pas exactement. Il y a des aspects des tableaux associatifs qui ne sont pas vrais pour les objets Javacript et qui peuvent faire trébucher les codeurs. (Les vrais tableaux associatifs ne sont pas limités par le fait que les clés doivent être des chaînes de caractères. La présence de propriétés prédéfinies héritées est une autre différence majeure). D'autre part, les tableaux Javascript, tout en étant des objets, se comportent comme on s'attend à ce qu'un tableau numérique se comporte. L'un est un aspect de la fonctionnalité, tandis que l'autre est une mise en œuvre interne.

8voto

Shadowbob Points 381

En ES6, vous pouvez utiliser l'opérateur d'étalement, si d[a] est indéfini, il l'ignorera, mais s'il a du contenu, il le conservera.

d[a] = { ...d[a], greeting: b, data: c };

La réponse acceptée remplacera tout ce qui se trouve dans d ce qui n'est pas le comportement que nous souhaitons toujours.

8voto

Polaris878 Points 7833

L'objet stocké à d[a] n'a pas été réglé sur quoi que ce soit. Ainsi, d[a] évalue à undefined . Vous ne pouvez pas attribuer une propriété à undefined :). Vous devez assigner un objet ou un tableau à d[a] :

d[a] = [];
d[a]["greeting"] = b;

console.debug(d);

2 votes

Le mieux est d'attribuer un objet : d[a] = {}; - L'utilisation de tableaux avec des clés non numériques a tendance à entraîner des problèmes en aval.

5voto

wukong Points 849

En javascript, presque tout est un objet, null y undefined sont des exceptions.

Instances de Array est un objet. vous pouvez donc définir la propriété d'un tableau, pour la même raison, vous ne pouvez pas définir la propriété d'un indéfini, parce que son PAS un objet

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X