在下面的javascript代码段中,为什么在运行此代码段时,tedious和concise中的元素不等效?我从第二个元素获得了/**ref:2**/输出的concise。
const tedious = [
{},
{},
{},
{},
{},
{},
{},
{},
{},
];
const concise = new Array(9).fill({});
console.log(tedious);
console.log(concise);
发布于 2018-06-11 23:09:00
注意:不确定在运行代码段时发生了什么,但是在现实世界中,引用业务不会发生。
根据徐狐评论:
/**ref:2**/的意思是“对数组元素2的引用”,因为Stack代码段的控制台特性不知道是否有无限嵌套的结构,因此使用了ref注释(以及在本例中不使用的id注释)。
实问题
const concise = new Array(9).fill({});是所有9个条目都将“引用”同一个对象--参见输出。
const concise = new Array(9).fill({}); // {}
concise[0].a='hello world';
console.log(JSON.stringify(concise))
为了更好地说明这一点,让我们将一个非空对象传递给具有随机值的fill。
const concise = new Array(9).fill({random:Math.floor(Math.random() * 1000)});
console.log(JSON.stringify(concise))
显然,该对象只创建了一次。
试一试
const concise = new Array(9).fill(0).map(() => ({}));
concise[0].a='hello world';
console.log(JSON.stringify(concise))
当对每个元素调用一次映射回调时,每次都会创建一个新对象。
或者你可以试试
const concise = Array.from({length:9}, () => ({}));
concise[0].a='hello world';
console.log(JSON.stringify(concise))
Array.from的第二个参数是对每个元素调用一次的回调,它基本上是相同的.map
当然,多亏了@ And,上面的内容更简单了
const concise = Array.from({length:9}, Object);比较上面的“数学随机”代码的输出
const concise = Array.from({length:9}, () => ({random:Math.floor(Math.random() * 1000)}));
console.log(JSON.stringify(concise))
https://stackoverflow.com/questions/50807131
复制相似问题