为什么带有属性的数组会导致JS

时间:2017-07-04 02:36:55

标签: javascript arrays properties

这种语法很好用:

var foo = [];
foo[0] = "do";
foo[1] = "re";

我试图使用属性来做同样的事情。

var foo = [{
    note: "",
}]; 
foo[0].note = "do";
foo[1].note = "re";

但在这种情况下,最后一行现在会生成一个未定义的变量错误。怎么了?

更新

回应评论我的问题可能更清楚。问题出现了,例如,当我尝试将值分配给for循环中的数组时,其中i是索引,类似于

foo[i] = i 

但使用带有属性的数组元素时,例如

foo[i].note = i 

它不会起作用,因为正如nnnnnn所说,只要索引达到1,该元素就不存在了。所以答案是我不能为数组元素赋值在这样的for循环中,我必须使用像fooNote [i]这样的变量?

5 个答案:

答案 0 :(得分:1)

您还需要索引1:

var foo = [{
    note: "",
},
{
    note:"" //note property for foo[1] is now set here
}]; 
foo[0].note = "do";
foo[1].note = "re";

console.log(foo);

您的原始数组没有设置索引。

答案 1 :(得分:0)

你的foo变量只有一个元素,在本例中是

{
note: "",
}

因此,当您尝试访问索引[1]时,此结果将显示在未定义的值上。

答案 2 :(得分:0)

您可以动态添加对象,但一次只能添加一个级别。 因此,当您说foo[1] = 're'时,您正在动态创建广告位1并为其指定值' re'。但foo[1].note = 're'正在尝试创建无法正常工作的插槽1和属性note。您可以foo[1] = {note: 're'};动态创建插槽1,并单独创建要分配给它的对象。

答案 3 :(得分:0)

你未定义,因为foo[1]未定义,它不存在,做这样的事情foo[1].note没有意义,因为undefined不是一个对象



 var foo = [{
    note: "",
}]; 

foo[0].note = "do";

Object.assign(foo[1] = {}, { note: "re" });

console.log(foo[1].note);




Object.assign将对象的成员复制到另一个对象中,在上面的代码中foo[1]被设置为一个对象,然后才将{note: "re"}复制到foo[1]

答案 4 :(得分:0)

看起来您认为您正在声明具有属性note的对象数组。您无法在javascript中真正做到这一点,您可以将其编写以供将来参考,因为它完全有效,可以用完全不同的东西覆盖它。

在你的情况下,foo [0]存在,而foo [1]不存在。您试图影响非现有属性的值,因此会出错。 执行var foo = [{note:""}];时,实际上有一个长度为1的数组。您可以访问foo [0],但foo [1]仍未定义。您需要为其分配值。

var foo = [{note: ""}]; // {note:""} is here for reference;
foo[0].note = "do"; // or foo[0] = {note: "do"};
foo[1] = {note: "re"};