JavaScript - 无法设置未定义的属性
Posted
技术标签:
【中文标题】JavaScript - 无法设置未定义的属性【英文标题】:JavaScript - cannot set property of undefined 【发布时间】:2011-11-20 17:26:00 【问题描述】:我的代码:
var a = "1",
b = "hello",
c = "100" : "some important data" ,
d = ;
d[a]["greeting"] = b;
d[a]["data"] = c;
console.debug (d);
我收到以下错误:
未捕获的类型错误:无法设置未定义的属性“问候”。
我正在尝试做一些类似于关联数组的事情。为什么这不起作用?
【问题讨论】:
d[a] 未定义。本质上 d["1"] 是未定义的 【参考方案1】:您永远不会将 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
;
【讨论】:
这确实有效。模式应该是:d = [a]: greetings: b, data: c @robertjewell,好点子,我已经更新了关于 ES2015 符号的注释。【参考方案2】:您必须将d[a]
设置为关联数组或对象:
d[a] = [];
d[a] = ;
没有设置,就是这样:
d[a] == undefined
,所以你在做undefined['greeting']=b;
,根据定义,undefined 没有属性。因此,您收到的错误。
【讨论】:
array
或 object
。 JS 没有关联数组,尽管Object
可以作为有限用途的数组。
@JeremyJStarcher:绝对正确且重要的是要知道,但是按照这种思维方式,javascript 没有数组;它只有对象
不完全是。关联数组的某些方面与 Javacript 对象不同,可能会绊倒编码人员。 (真正的关联数组[不受要求键是字符串的限制。继承的预定义属性的存在是另一个主要区别。)另一方面,Javascript 数组,而对象,就像一个期望数值数组的行为一样。一个是功能方面,另一个是内部实现。【参考方案3】:
存储在d[a]
的对象尚未设置为任何值。因此,d[a]
的计算结果为 undefined
。您不能将属性分配给undefined
:)。您需要将一个对象或数组分配给d[a]
:
d[a] = [];
d[a]["greeting"] = b;
console.debug(d);
【讨论】:
最好分配一个对象:d[a] = ;
- 使用带有非数字键的数组往往会导致问题。【参考方案4】:
在 javascript 中几乎所有东西都是对象,null
和 undefined
是例外。
Array
的实例是一个对象。所以你可以设置一个数组的属性,出于同样的原因,你不能设置一个未定义的属性,因为它不是一个对象
【讨论】:
【参考方案5】:我只是做一个简单的检查,看看 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);
【讨论】:
【参考方案6】:d = 现在是一个空对象。
而且 d[a] 也是一个空对象。
它没有任何键值。所以你应该初始化这个键值。
d[a] =
greetings:'',
data:''
【讨论】:
【参考方案7】:在 ES6 中你可以使用扩展运算符,如果 d[a]
未定义,它会忽略它,但如果它有内容,它会保留它
d[a] = ...d[a], greeting: b, data: c ;
接受的答案将覆盖 d
中的任何内容,这不是我们一直想要的行为
【讨论】:
以上是关于JavaScript - 无法设置未定义的属性的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript 运行时错误: 无法设置未定义或 null 引用的属性"innerText"
无法使用 HTML 设置未定义的 jQuery UI 自动完成的属性“_renderItem”
如何修复'TypeError:无法读取 Javascript 中未定义的属性'标题'