JavaScript-无法设置未定义的属性


108

我的代码:

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

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

console.debug (d);

我收到以下错误:

Uncaught TypeError:无法设置未定义的属性“ greeting”。

我正在尝试做类似于关联数组的操作。为什么这不起作用?


1
d [a]未定义。本质上d [“ 1”]是不确定的
Joseph Marikle 2011年

Answers:


159

您永远不会设置d[a]任何值。

因此,d[a]计算为undefined,您无法在上设置属性undefined

如果您添加d[a] = {}正确,d = {}事情应该会按预期进行。

另外,您可以使用对象初始化程序:

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

或者,您可以d在匿名函数实例中设置的所有属性:

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

如果您所在的环境支持ES2015功能,则可以使用计算属性名称

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

这确实有效。模式应为:d = {[[a]:{问候:b,数据:c}}
robskrob

@robertjewell,很好,我已更新为包括关于ES2015表示法的注释。
zzzzBov

惊人的解释。
斐济汗

32

您必须设置d[a]为关联数组或对象:

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

没有设置,这是正在发生的事情:

d[a] == undefined,因此您正在做,undefined['greeting']=b;并且根据定义,undefined没有属性。因此,您收到的错误。


arrayobject。JS没有关联数组,尽管Object在有限的用途上可以像一个数组 一样。
杰里米·J·斯塔彻

@JeremyJStarcher:绝对正确且重要,要知道,但从这种水平来看,JavaScript没有数组。它只有对象
vol7ron 2012年

不完全是。关联数组的某些方面对于Javacript对象可能会使编码器绊倒是不正确的。(真正的关联数组不受要求键为字符串的限制。继承的预定义属性的存在是另一个主要区别。)另一方面,Javascript数组虽然对象,但是却像数字数组那样工作。一个是功能方面,而另一个是内部实现。
杰里米·J·斯塔彻

6

存储在的对象d[a]尚未设置为任何对象。因此,d[a]计算为undefined。您不能将属性分配给undefined:)。您需要将一个对象或数组分配给d[a]

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

console.debug(d);

2
最好分配一个对象:d[a] = {};-使用带有非数字键的数组往往会导致问题。
nnnnnn

5

在javascript中,几乎所有东西都是对象,null并且undefined都是例外。

的实例Array是一个对象。出于相同的原因,您可以设置数组的属性,而不能设置未定义的属性,因为它不是对象


3

我只是做一个简单的检查,看看d [a]是否存在,如果不初始化的话...

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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.