前端开发遇到的bug——关于指针

2018-09-26  本文已影响20人  Switchhh
let oldList = [
  {oldName: '张三', oldAge: '30'},
  {oldName: '李四', oldAge: '35'}
];
let newList = [];
let map = {};
oldList.forEach((item) => {
  map['newName'] = item.oldName;
  map['newAge'] = item.oldAge;
  newList.push(map);
});
// newList 出现了重复 oldList 最后一条数据的情况
// [
//   {newName: "李四", newAge: "35"},
//   {newName: "李四", newAge: "35"}
// ]
// 这次在遍历过程中打印一下 map 看一看
oldList.forEach((item) => {
  map['newName'] = item.oldName;
  map['newAge'] = item.oldAge;
  newList.push(map);

  console.log(map);
});
console.log(map) 结果
// 解决的方法:改变 map 声明的位置

// let map = {};
oldList.forEach((item) => {
  let map = {}; // 修改后将 map 的声明拿进来
  map['newName'] = item.oldName;
  map['newAge'] = item.oldAge;
  newList.push(map);
});
// [
//   {newName: "张三", newAge: "30"},
//   {newName: "李四", newAge: "35"}
// ]

这里出现这个问题的原因是map是指向{}的指针,真正被改变的不是map而是内存中map指向的位置也就是{},因此map在遍历前声明的话就会导致所有的newList数据都指向这个只声明了一次的map,然后这个唯一的map指向了在内存中唯一的{}

map newList
{newName: "李四", newAge: "35"} {newName: "李四", newAge: "35"}
- {newName: "李四", newAge: "35"}
- {newName: "李四", newAge: "35"}
- {newName: "李四", newAge: "35"}

因此需要每次遍历就声明一次map,这样就可以在内存中开辟一个新的map作为指向新{}的唯一指针,而不是所有的newList数据都指向一个{}

map newList
{newName: "张三", newAge: "30"} {newName: "张三", newAge: "30"}
{newName: "李四", newAge: "35"} {newName: "李四", newAge: "35"}

参考<基本数据类型和引用类型的区别详解>

上一篇 下一篇

猜你喜欢

热点阅读