JavaScript - 无法设置undefined的属性

时间:2011-09-20 02:44:04

标签: javascript

我的代码:

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

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

console.debug (d);

我收到以下错误:

  

未捕获的TypeError:无法设置未定义的属性'greeting'。

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

7 个答案:

答案 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中,几乎所有内容都是对象,nullundefined都是例外。

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 中的任何内容,这不是我们一直想要的行为