2011-09-20 21 views
74

我的代码属性:JavaScript的 - 不能设置的不确定

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

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

     console.debug (d); 

我得到以下错误:

Uncaught TypeError: Cannot set property 'greeting' of undefined.

我试图做类似的关联数组的东西。为什么这不起作用?

+0

d [a]是未定义的。本质上d [“1”]是未定义的 –

回答

98

您从未将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功能的环境,您可以使用computed property names

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

这是行不通的。该模式应该是:d = {[a]:{问候:b,数据:c}} – robertjewell

+0

@robertjewell,好点,我已经更新以包括关于ES2015符号的注释。 – zzzzBov

4

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

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

console.debug(d); 
+1

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

21

你必须设置d[a]到任何一个关联数组或对象:

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

没有设置,这是wha t的事情发生了:

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

+0

'array'或'object'。 JS没有关联数组,尽管'Object'可以用于有限用途。 –

+0

@JeremyJStarcher:绝对正确和重要的是知道,但通过这种思维水平,JavaScript没有数组;它只有对象 – vol7ron

+0

不完全。关联数组有些方面关于JavaScript对象是不正确的,这些对象可能会使编码器发生故障。 (真正的关联数组没有被限制,因为要求键是字符串,继承的预定义属性的存在是另一个主要的区别。)另一方面,Javascript数组虽然对象的行为像一个数组,但它需要一个数组来表现行为。一个是功能的一个方面,另一个是内部实现。 –

4

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

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