JavaScript - 无法设置未定义的属性

Posted

技术标签:

【中文标题】JavaScript - 无法设置未定义的属性【英文标题】:JavaScript - cannot set property of undefined 【发布时间】:2019-01-18 01:22:48 【问题描述】:

我的代码:

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] 的计算结果为 undefined。您不能将属性分配给undefined :)。您需要将一个对象或数组分配给d[a]

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

console.debug(d);

【讨论】:

最好分配一个对象:d[a] = ; - 使用带有非数字键的数组往往会导致问题。【参考方案3】:

您必须将d[a] 设置为关联数组或对象:

d[a] = []; d[a] = ;

没有设置,就是这样:

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

【讨论】:

arrayobject。 JS 没有关联数组,尽管Object 可以作为有限用途的数组。 @JeremyJStarcher:绝对正确且重要的是要知道,但是按照这种思维方式,javascript 没有数组;它只有对象 不完全是。关联数组的某些方面与 Javacript 对象不同,可能会绊倒程序员。 (真正的关联数组[不受要求键是字符串的限制。继承的预定义属性的存在是另一个主要区别。)另一方面,Javascript 数组,而对象,就像一个期望数值数组的行为一样。一个是功能方面,另一个是内部实现。【参考方案4】:

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

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 - 无法设置未定义的属性的主要内容,如果未能解决你的问题,请参考以下文章

无法设置未定义 4 的属性“大小”

JavaScript 运行时错误: 无法设置未定义或 null 引用的属性"innerText"

无法使用 HTML 设置未定义的 jQuery UI 自动完成的属性“_renderItem”

如何修复'TypeError:无法读取 Javascript 中未定义的属性'标题'

未捕获的类型错误:无法读取未定义 javascript 的属性“选项”

无法读取电子 javascript 中未定义的属性“on”