在 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};
这条语句:
- 在堆中创建对象
- 将局部符号
boxA
与该对象相关联。
所以对象被一个变量引用了。
var boxArray = [boxA];
此处:
- 创建了一个只有一个元素的数组。该元素包含对对象的引用。准确地说是参考文献的副本。所以,同一个原始对象现在被引用了两次。
- 一个
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);
}
如果我们创建一些对象,并用这些对象填充一个数组,那么数组中存储的是名称,还是仅存储对象的属性? 我想这可能是微不足道的,但我一直没能找到答案。
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};
这条语句:
- 在堆中创建对象
- 将局部符号
boxA
与该对象相关联。
所以对象被一个变量引用了。
var boxArray = [boxA];
此处:
- 创建了一个只有一个元素的数组。该元素包含对对象的引用。准确地说是参考文献的副本。所以,同一个原始对象现在被引用了两次。
- 一个
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);
}