数组map的深浅拷贝问题


数组map的深浅拷贝问题

// 基本数据类型
let a = [ 1, 2 , 3 ]

let res = a.map(item => {
   return item * 2
  }
)

[2, 4, 6]  // res

res[0] = 10

[10, 4, 6] // 修改后的res

[1, 2, 3]  // 原数组a并未受影响
// 引用数据类型

type CommonObj = {
  name: string,
  age: number,
  sex: string
}


let aaa: CommonObj[] = [
  {
    name: '牛哼',
    age: 23,
    sex: '男'
  },
  {
    name: '大脚',
    age: 22,
    sex: '女'
  },
  {
    name: '翠花',
    age: 18,
    sex: '女'
  },
  {
    name: '神魔恋',
    age: 25,
    sex: '男'
  },
]

let result = aaa.map((item: CommonObj, index: number): CommonObj => {
  if (item.name === '牛哼') {
    item.name = '牛恒'
  }
  if (item.age === 18) {
    item.age = 17
  }
  if (item.sex === '男') {
    item.sex = '女'
  }
  return item
})


// console.log('result', result);
// console.log('aaa', aaa);

// 两厢打印一致
    //result [
    //  { name: '牛恒', age: 23, sex: '女' },
    //  { name: '大脚', age: 22, sex: '女' },
    //  { name: '翠花', age: 17, sex: '女' },
    //  { name: '神魔恋', age: 25, sex: '女' }
    //]
    //aaa [
    //  { name: '牛恒', age: 23, sex: '女' },
    //  { name: '大脚', age: 22, sex: '女' },
    //  { name: '翠花', age: 17, sex: '女' },
    //  { name: '神魔恋', age: 25, sex: '女' }
    //]

// aaa[0].name = 'niubiheng'
// console.log('arr', aaa);
// console.log('改变', result);

  //  arr第零项改变,result也被改变
    // arr [
    //   { name: 'niubiheng', age: 23, sex: '女' },
    //   { name: '大脚', age: 22, sex: '女' },
    //   { name: '翠花', age: 17, sex: '女' },
    //   { name: '神魔恋', age: 25, sex: '女' }
    // ]
    // 改变 [
    //   { name: 'niubiheng', age: 23, sex: '女' },
    //   { name: '大脚', age: 22, sex: '女' },
    //   { name: '翠花', age: 17, sex: '女' },
    //   { name: '神魔恋', age: 25, sex: '女' }
    // ]

// console.log(aaa[0] === result[0]);  // true

其他

map和filter最大的区别就是

Map可以把每一项元素拦截,再做一些操作,改变每一个item中的属性值。

filter 也会把每个item过一遍,但它必须根据item的某些条件,决定是否保留这个item。

文章作者: KarlFranz
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 reprint policy. If reproduced, please indicate source KarlFranz !
评论
  目录