【问题标题】:JavaScript - cannot set property of undefinedJavaScript - 无法设置未定义的属性
【发布时间】: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"] 是未定义的

标签: javascript


【解决方案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 没有属性。因此,您收到的错误。

【讨论】:

  • arrayobject。 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 中几乎所有东西都是对象,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 中的任何内容,这不是我们一直想要的行为

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-27
          • 2022-10-30
          • 2023-02-10
          相关资源
          最近更新 更多