JavaScript - não é possível definir propriedade de indefinido

108

Meu código:

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

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

console.debug (d);

Estou tendo o erro a seguir:

TypeError não capturado: Não é possível definir a propriedade 'saudação' de undefined.

Estou tentando fazer algo semelhante a uma matriz associativa. Por que não está funcionando?

StackOverflowNewbie
fonte
1
d [a] é indefinido. Em essência, d ["1"] é indefinido
Joseph Marikle de

Respostas:

159

você nunca define d[a]nenhum valor.

Por causa disso, d[a]avalia como undefinede você não pode definir propriedades como undefined.

Se você adicionar d[a] = {}logo depois, as d = {}coisas funcionarão conforme o esperado.

Como alternativa, você pode usar um inicializador de objeto:

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

Ou você pode definir todas as propriedades de dem uma instância de função anônima:

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

Se você estiver em um ambiente compatível com os recursos do ES2015, poderá usar nomes de propriedades computadas :

d = {
  [a]: {
    greetings: b,
    data: c
  }
};
zzzzBov
fonte
Isso funciona. o padrão deve ser: d = {[a]: {saudações: b, dados: c}}
robskrob
@robertjewell, bom ponto, atualizei para incluir a nota sobre a notação ES2015.
zzzzBov
Explicação incrível.
fiza khan de
32

Você deve definir d[a]uma matriz associativa ou um objeto:

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

Sem configuração, isto é o que está acontecendo:

d[a] == undefined, então você está fazendo undefined['greeting']=b;e, por definição, undefined não tem propriedades. Assim, o erro que você recebeu.

Vol7ron
fonte
arrayou object. JS não tem arrays associativos, embora Objectpossa funcionar como um para usos limitados.
Jeremy J Starcher
@JeremyJStarcher: absolutamente correto e importante saber, mas por esse nível de pensamento, JavaScript não tem matrizes; ele só tem objetos
vol7ron
Não exatamente. Existem aspectos dos arrays associativos que não são verdadeiros sobre os objetos Javacript que podem enganar os codificadores. (Os arrays associados verdadeiros não são limitados por exigir que as chaves sejam strings. A presença de propriedades predefinidas herdadas é outra diferença importante.) Por outro lado, os arrays Javascript, enquanto objetos, agem como se esperasse que um array numérico se comportasse. Um é um aspecto da funcionalidade, enquanto o outro é a implementação interna.
Jeremy J Starcher
6

O objeto armazenado em d[a]não foi definido para nada. Assim, d[a]avalia undefined. Você não pode atribuir uma propriedade a undefined:). Você precisa atribuir um objeto ou matriz a d[a]:

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

console.debug(d);
Polaris878
fonte
2
Melhor atribuir um objeto: d[a] = {};- o uso de matrizes com teclas não numéricas tende a causar problemas no futuro.
nnnnnn de
5

Em javascript quase tudo é um objeto nulle undefinedsão exceção.

Instâncias de Arrayé um objeto. então você pode definir a propriedade de um array, pela mesma razão, você não pode definir a propriedade de um undefined, porque NÃO é um objeto

wukong
fonte
3

Eu faria apenas uma verificação simples para ver se d [a] existe e se não inicializaria ...

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

    if (d[a] === undefined) {
        d[a] = {}
    };
    d[a]["greeting"] = b;
    d[a]["data"] = c;

    console.debug (d);
Iohzrd
fonte