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

IT技术 javascript
2021-01-30 16:33:16

我的代码:

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

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

console.debug (d);

我收到以下错误:

未捕获的类型错误:无法设置未定义的属性“问候语”。

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

6个回答

您从未设置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
  }
};
@robertjewell,好点,我已经更新以包含关于 ES2015 符号的注释。
2021-03-22 16:33:16
这确实有效。模式应该是:d = { [a]: { greetings: b, data: c } }
2021-04-04 16:33:16

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

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

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

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

@JeremyJStarcher:知道绝对正确且重要,但从这个角度来看,JavaScript 没有数组;它只有对象
2021-03-15 16:33:16
不完全是。关于 Javacript 对象,关联数组的某些方面可能会绊倒编码人员。(真正的关联数组[不受要求键必须是字符串的限制。继承的预定义属性的存在是另一个主要区别。)另一方面,Javascript 数组,而对象,表现得就像一个期望数值数组的行为。一个是功能的一个方面,而另一个是内部实现。
2021-03-23 16:33:16
arrayobjectJS 没有关联数组,但Object可以像一个有限用途的数组 一样工作。
2021-04-06 16:33:16

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

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

console.debug(d);
最好分配一个对象:d[a] = {};- 使用带有非数字键的数组往往会导致问题。
2021-03-30 16:33:16

在JavaScript几乎一切都是对象,null并且undefined是例外。

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

我只是做一个简单的检查,看看 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);