美文网首页
前端开发遇到的bug——关于指针

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

作者: Switchhh | 来源:发表于2018-09-26 17:47 被阅读20次
  • 需求:将原数组中每条数据对象的键更名
  • 实现:
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"}

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

相关文章

网友评论

      本文标题:前端开发遇到的bug——关于指针

      本文链接:https://www.haomeiwen.com/subject/ofhloftx.html