你能在不使用 eval() 的情况下使用变量名来引用对象吗

Can you use a variable name to reference an Object without using eval()

所以,

我知道可以在对象上创建动态键。

const foo = 'bar';
const obj = {
    [foo]: 'this is bar',
};

但是是否可以通过变量值来引用对象。例如,如果我们有 3 个对象:

const obj1 = {}
const obj2 = {}
const obj3 = {}

还有一个包含他们名字的数组

const objects = ['obj1', 'obj2', 'obj3'];

我们可以遍历这些名称并引用它们的对象吗?这行不通:

objects.forEach(obj => Object.assign(obj, { extended: true }));

但这将:

objects.forEach(obj => Object.assign(eval(obj), { extended: true }));

但是 Mozilla 的文档声明“永远不要使用 eval!

因此,如果我没理解错的话,您有一个 objectKeys 列表,并且您想要生成这些对象的数组。这行得通吗?


const objNames = ['obj1', 'obj2', 'obj3' ]
let objects = [];

for(let i = 0; i < objNames.length; i++){

  let tempObj = {};

  tempObj[objNames[i]] = {extended:true}

  objects.push(tempObj);
}

如果我理解正确你的问题,你可以这样做。

const obj1 = {id: 1}
const obj2 = {id: 2}
const obj3 = {id: 3}


var objects = ['obj1', 'obj2', 'obj3'].map(element => [element]);

console.log('objects : ', objects)

答案是你不能。

在 JS 中,无法动态访问或创建变量,除非您 eval(或非常相似的 Function 构造函数)。

虽然在 var 的全局作用域中创建的变量将成为全局对象的属性并且您可以在其上访问它们,但也不推荐这样做(由于 var 出现的问题,使用保留名称等),并且仅在全局范围内工作(更糟糕的是)。

您能做的最好的事情就是将这些变量放入一个对象中,这样您就可以动态访问它们。 JS 变量对此不利。

不,你不能(没有 eval()),这不是一个好主意,因为变量名可以修改,例如,如果你使用缩小器

我建议使用数组

const objects = [{}, {}, {}]

或者,如果名称很重要,对象:

const objects = {
  obj1: {},
  obj2: {},
  obj3: {},
};

因此您可以轻松地对其进行迭代