对象内部的 Javascript 对象

Javascript Object inside of Object

本文关键字:对象 Javascript 内部      更新时间:2023-10-01

我正在使用系统发育树,我想要树本身的对象,然后每个物种都有一个对象,总共 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 文件。

你所拥有的应该可以工作,但它可以写得更干净一点。 我会建议这个:

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索引

要回答您的其他问题之一,当您执行此操作时:

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 的这一方面不会对字符串产生太大影响。 但是,知道数组和对象是通过引用分配的非常重要的。