在 javascript 中的命名对象数组中 - 名称是否可访问?

In an array of named objects in javascript - are the names accessible?

如果我们创建一些对象,并用这些对象填充一个数组,那么数组中存储的是名称,还是仅存储对象的属性? 我想这可能是微不足道的,但我一直没能找到答案。

var boxA = {color: "red", width: 100};
var boxB = {color: "yellow", width: 200};
var boxC = {color: "blue", width: 300};

boxArray = [boxA, boxB, boxC];

for (var i = 0; i < boxArray.length; i++) {

    //****
    // What code do we insert here to log
    // boxA
    // boxB
    // boxC
    //****

}

当然,添加

是一个简单的解决方法
boxA.box = boxA; 

等然后调用

console.log(boxArray[i].box);

但这真的有必要吗?

好吧,boxArray 中充满了您放入其中的变量值。例子: 如果您要保存三个整数变量而不是变量名称。所以你的新 boxArray 等于:

boxArray = [{color: "red", width: 100},{color: "yellow", width: 200},{color: "blue", width: 300}];

不,那不是那样的。

变量名是对内存区域中对象的引用,由JS自动为你管理。

详细的意思是:

var boxA = {color: "red", width: 100};

这条语句:

  1. 在堆中创建对象
  2. 将局部符号 boxA 与该对象相关联。

所以对象被一个变量引用了。

var boxArray = [boxA];

此处:

  1. 创建了一个只有一个元素的数组。该元素包含对对象的引用。准确地说是参考文献的副本。所以,同一个原始对象现在被引用了两次。
  2. 一个boxArray被赋值了一个数组的引用,也是放在堆中

总结一下:变量名只存在于代码清单中,让开发者更容易推理内存中的一些对象,而不是用内存地址操作(那会很糟糕)。

如果您想获取对象的键,请尝试 Object.keys(object)

Object.keys(boxA)
["color", "width"]

直接回答您的问题 - 不,您不能按照您的要求去做。我 运行 多次遇到相同的情况。这就是我所做的。您可以不使用数组,而是将对象添加到对象文字,并将对象映射到某个唯一键,例如 id。

var boxes = {
  boxA: { color: 'red', width: 100 },
  boxB: { color: 'blue', width: 200 },
  boxC: { color: 'yellow', width: 300 },
};

for (var boxKey in boxes) {
  console.log(boxKey);
}

// to use
boxes.boxA; // do something with boxA

执行代码无法访问您的变量名,但如果您需要这样做,您可以嵌套对象:

var boxes = {
  boxA: {
    color: "red",
    width: 100
  },
  boxB: {
    color: "yellow",
    width: 200
  },
  boxC: {
    color: "blue",
    width: 300
  }
};

Object.keys(boxes).forEach(function(key) {
  console.log(key) // boxA, boxB, boxC
  console.log(boxes[key]) // {color: "red", width: 100}, etc.
});

晚会但是...自从 ES6 javascript 引入 类 以来。如果 类 是一个选项,您可以这样做:

class boxA { constructor() { this.color = "red"; this.width = 100; } };
class boxB { constructor() { this.color = "yellow"; this.width = 200; } };
class boxC { constructor() { this.color = "blue"; this.width = 300; } };

let boxArray = [new boxA(), new boxB(), new boxC()];

for (var i = 0; i < boxArray.length; i++) {
  console.log(boxArray[i].constructor.name);
}