JavaScript-不能设置未定义的属性

我的代码:

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


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


console.debug (d);

我得到以下错误:

未捕获的 TypeError: 无法设置未定义的属性“问候语”。

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

628113 次浏览

你从来没有设置 d[a]为任何值。

因此,d[a]的计算结果为 undefined,因此不能在 undefined上设置属性。

如果你在 d = {}之后立即添加 d[a] = {},那么事情就应该按照预期的那样进行。

或者,您可以使用对象初始值设定项:

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]中的对象尚未设置为任何值。因此,d[a]的计算结果为 undefined。不能将属性分配给 undefined:)。您需要将一个对象或数组赋给 d[a]:

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


console.debug(d);

你必须将 ABc0设置为一个关联数组或一个对象:

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

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

因此,您正在执行 undefined['greeting']=b;,并且根据定义,未定义的没有属性。

在 javascript 中,几乎所有东西都是对象,nullundefined是例外。

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);

D = {}现在是一个空对象。

D [ a ]也是一个空对象。

它没有任何键值。

d[a] = {
greetings:'',
data:''
}

在 ES6中,您可以使用扩展运算符,如果 d[a]未定义,它只会忽略,但如果它有内容,它将保留它

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

接受的答案将覆盖 d中的任何内容,这不是我们一直想要的行为

这是由于没有正确定义对象属性的结构而将值设置为对象属性造成的。

下面的代码会出现这样的错误,因为我们正在为一个数组赋值。这不可能。

let boatNames = [];
boats.map(boat => {
while( i < boats.length){
boatNames[i].name = boat.boat.name;
i++;
}
})

为了使其正常工作,在为属性(boatNames[i].name = boat.boat.name;)设置某个值之前,请确保首先定义它。像这样... boatNames[i] = {};