js fill初始化数组问题

   var arr = new Array(3).fill({
     name: 'deng',
     age: 18,
     job: 'software'
   })

   console.log(arr)

   arr[0].name = 'dengbbbb'

   console.log(arr)

图片描述

这样只改变其中一个属性 为啥其他对象相应的属性也跟着改变了啊 有大佬知道这个是什么问题么???

阅读 4.7k
3 个回答

因为Array.fill()如果填充类型为对象,则为浅拷贝。数组内的3个对象指向的都是同一个内存地址。

你可以这样做
var arr = new Array(3).fill(JSON.stringify({
    name: 'deng',
    age: 18,
    job: 'software'
}))
    arr=arr.map(item=>JSON.parse(item))
    console.log(arr)

    arr[0].name = 'dengbbbb'

    console.log(arr)

clipboard.png

关于深拷贝与浅拷贝可以参考以下文章

js 深拷贝 vs 浅拷贝

如果简单明了点说,就是他们指向了同一块儿内存。所以一个变动就多个一起变动。
如果想要各自独立,就得指向不同的内容。

var arr = Array.apply(null, { length: 3 }).map(() => ({
    name: 'deng',
    age: 18,
    job: 'software'
}));
arr[0].name = 'dengbbbb';
console.log(arr);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题