我正在使用系统发育树,我想要一个树本身的物体,然后是每个物种的一个物体,总共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文件。
答案 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];
}
我改变的事情:
{}
和[]
来定义数组和对象,而不是new Object()
和new Array()
。for (var i = 0; i < xxx.length; i++)
语法仅迭代数组元素,而不是所有属性。这是迭代数组元素的“安全”方式。String(count)
。添加到另一个字符串时,Javascript会自动将数字转换为字符串。for
索引要回答其他问题,请执行以下操作:
tree.leaf1 = speciesA;
您已将speciesA
的“参考”分配给tree.left1
。引用就像一个指针。它不是副本。所以,两者都指的是完全相同的对象。您对speciesA
或tree.leaf1
所做的任何更改都会对完全相同的对象进行更改。
所以,当你这样做时:
//Not sure if this next line assigns to speciesA or what exactly happens
tree.leaf1.attributes = new Array("Attr1","Attr2",etc);
您确实正在修改speciesA
对象,因为speciesA
和tree.leaf1
指向同一个对象。
在javascript中,数组,对象和字符串通过引用分配。这意味着当您为变量赋值时,它只指向原始对象。没有制作副本。因此,通过任何一个更改对象将更改另一个(因为它们都指向同一个对象)。字符串是不可变的(字符串永远不会被更改)。对字符串进行修改的事情总是只返回一个新字符串,因此javascript的这个方面对字符串的影响不大。但是,知道通过引用分配数组和对象非常重要。