我的代码:
var a = "1",
b = "hello",
c = { "100" : "some important data" },
d = {};
d[a]["greeting"] = b;
d[a]["data"] = c;
console.debug (d);
我收到以下错误:
未捕获的TypeError:无法设置未定义的属性'greeting'。
我正在尝试做一些类似于关联数组的事情。为什么这不起作用?
答案 0 :(得分:135)
您从未将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功能,则可以使用computed property names:
d = {
[a]: {
greetings: b,
data: c
}
};
答案 1 :(得分:28)
您必须将d[a]
设置为关联数组或对象:
d[a] = [];
d[a] = {};
没有设定,这就是发生的事情:
d[a] == undefined
,所以你正在做undefined['greeting']=b;
,根据定义,undefined没有属性。因此,你收到的错误。
答案 2 :(得分:6)
存储在d[a]
的对象尚未设置为任何内容。因此,d[a]
评估为undefined
。您无法将属性分配给undefined
:)。您需要将对象或数组分配给d[a]
:
d[a] = [];
d[a]["greeting"] = b;
console.debug(d);
答案 3 :(得分:5)
在javascript中,几乎所有内容都是对象,null
和undefined
都是例外。
Array
的实例是一个对象。所以你可以设置一个数组的属性,出于同样的原因,你不能设置undefined的属性,因为它的 NOT 一个对象
答案 4 :(得分: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);
答案 5 :(得分:0)
d = {}现在是一个空对象。
并且d [a]也是一个空对象。
它没有任何键值。因此,您应该为此初始化键值。
d[a] = {
greetings:'',
data:''
}
答案 6 :(得分:0)
在 ES6 中,您可以使用扩展运算符,如果 d[a]
未定义,它将忽略,但如果它有内容,它将保留它
d[a] = { ...d[a], greeting: b, data: c };
接受的答案将覆盖 d
中的任何内容,这不是我们一直想要的行为