对象内的Javascript对象

时间:2013-11-25 04:04:22

标签: javascript html object

我正在使用系统发育树,我想要一个树本身的物体,然后是每个物种的一个物体,总共4种。我试图让树包含tree.leaf下的物种对象,然后通过树对象为每个物种分配一个属性数组,因为我随机化物种的顺序,所以我不能依赖物种名字,但我可以使用叶子放置(希望有意义)。我在更新html时遇到了麻烦,虽然这是一个表格内的div。

简化版:

var tree = new Object();
var speciesA = new Object();

tree.leaf1 = speciesA;
//Not sure if this next line assigns to speciesA or what exactly happens
tree.leaf1.attributes = new Array("Attr1","Attr2",etc);

var count = 1;
for(attr in speciesA.attributes)
{
    //There are 4 divs per speices to display attributes
    document.getElementById("A"+String(count)).innerhtml = speciesA.attributes[attr];
    count++;// used to specify divs ie A1 = attribute1, A2 = attribute2 etc
}

所以我想我的主要问题是这项工作/我认为它做了什么?

如果需要,我可以粘贴我的html和完整的js文件。

1 个答案:

答案 0 :(得分:1)

你有什么应该工作,但它可以写得更清洁。我建议这样做:

var tree = {
    leaf1: {attributes: ["Attr1", "Attr2"]}
};

var attributes = tree.leaf1.attributes;
for (var i = 0; i < attributes.length; i++) {
    document.getElementById("A"+(i+1)).innerHTML = attributes[i];
}

我改变的事情:

  1. 使用javascript文字使定义更加紧凑
  2. 使用{}[]来定义数组和对象,而不是new Object()new Array()
  3. 使用for (var i = 0; i < xxx.length; i++)语法仅迭代数组元素,而不是所有属性。这是迭代数组元素的“安全”方式。
  4. 删除不需要的String(count)。添加到另一个字符串时,Javascript会自动将数字转换为字符串。
  5. 缓存属性数组的值以保存每次都必须深度引用它。
  6. 删除单独的计数变量,因为可以使用for索引

  7. 要回答其他问题,请执行以下操作:

    tree.leaf1 = speciesA;
    

    您已将speciesA的“参考”分配给tree.left1。引用就像一个指针。它不是副本。所以,两者都指的是完全相同的对象。您对speciesAtree.leaf1所做的任何更改都会对完全相同的对象进行更改。

    所以,当你这样做时:

    //Not sure if this next line assigns to speciesA or what exactly happens
    tree.leaf1.attributes = new Array("Attr1","Attr2",etc);
    

    您确实正在修改speciesA对象,因为speciesAtree.leaf1指向同一个对象。


    在javascript中,数组,对象和字符串通过引用分配。这意味着当您为变量赋值时,它只指向原始对象。没有制作副本。因此,通过任何一个更改对象将更改另一个(因为它们都指向同一个对象)。字符串是不可变的(字符串永远不会被更改)。对字符串进行修改的事情总是只返回一个新字符串,因此javascript的这个方面对字符串的影响不大。但是,知道通过引用分配数组和对象非常重要。