首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用array.fill创建对象数组?

如何使用array.fill创建对象数组?
EN

Stack Overflow用户
提问于 2018-06-11 22:57:41
回答 1查看 4.1K关注 0票数 4

在下面的javascript代码段中,为什么在运行此代码段时,tediousconcise中的元素不等效?我从第二个元素获得了/**ref:2**/输出的concise

代码语言:javascript
复制
const tedious = [
  {},
  {},
  {},
  {},
  {},
  {},
  {},
  {},
  {},
];

const concise = new Array(9).fill({});

console.log(tedious);
console.log(concise);

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-11 23:09:00

注意:不确定在运行代码段时发生了什么,但是在现实世界中,引用业务不会发生。

根据徐狐评论:/**ref:2**/的意思是“对数组元素2的引用”,因为Stack代码段的控制台特性不知道是否有无限嵌套的结构,因此使用了ref注释(以及在本例中不使用的id注释)。

问题

代码语言:javascript
复制
const concise = new Array(9).fill({});

是所有9个条目都将“引用”同一个对象--参见输出。

代码语言:javascript
复制
const concise = new Array(9).fill({}); // {} 
concise[0].a='hello world';
console.log(JSON.stringify(concise))

为了更好地说明这一点,让我们将一个非空对象传递给具有随机值的fill

代码语言:javascript
复制
const concise = new Array(9).fill({random:Math.floor(Math.random() * 1000)});
console.log(JSON.stringify(concise))

显然,该对象只创建了一次。

试一试

代码语言:javascript
复制
const concise = new Array(9).fill(0).map(() => ({}));

concise[0].a='hello world';
console.log(JSON.stringify(concise))

当对每个元素调用一次映射回调时,每次都会创建一个新对象。

或者你可以试试

代码语言:javascript
复制
const concise = Array.from({length:9}, () => ({}));

concise[0].a='hello world';
console.log(JSON.stringify(concise))

Array.from的第二个参数是对每个元素调用一次的回调,它基本上是相同的.map

当然,多亏了@ And,上面的内容更简单了

代码语言:javascript
复制
const concise = Array.from({length:9}, Object);

比较上面的“数学随机”代码的输出

代码语言:javascript
复制
const concise = Array.from({length:9}, () => ({random:Math.floor(Math.random() * 1000)}));
console.log(JSON.stringify(concise))

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50807131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档