• 关于数组赋值指向、拷贝的问题


    我们有这样一段代码

    // 构建数据
    let obj = {name: '名字' ,age: 18};
    let list = [];
    for(let i=0; i<60; i++) list.push(obj)
    
    // 开始处理数据
    let Arr = [];
    let cloneArr = [];
    for(let j=0; j<2; j++) Arr.push(cloneArr)
    list.map((item,inx) => {
      if(inx < 50) Arr[0].push(item);
      else if(inx >= 50 && inx < 100) Arr[1].push(item);
    })
    console.log(Arr)

    我们理想的状态应该是这样的

    但是实际得到的结果是

     这里存在一个数组内部指向问题和拷贝赋值的问题,在我们通过for循环为Arr动态生成内部数组时,这里我们push的是事先声明的数组变量cloneArr,下面在map循环里面无论是操作的Arr[0]还是Arr[1],都是在操作cloneArr这个数组变量,Arr[0]、Arr[1]它们都指向cloneArr,为了解决这个问题,我们可以在动态给Arr内部push数组时,使用下面两种方式:

    1.我们直接使用深拷贝来为其赋值,在map循环中操作Arr内部数组,他们的指向由于深拷贝作用,不会在指向数组变量cloneArr

    Arr.push(JSON.parse(JSON.stringify(cloneArr)))

    2.摒弃掉cloneArr,每次push都是直接创建一个新的数组,就不会出现指向和拷贝作用

    Arr.push([])

    Tips:在工作中会有很多人遇到这种细节上面的问题,但是很多人不明就里,其实只要理解到原理,其实就很简单。

  • 相关阅读:
    dwr中的部分问题和总结
    UltraEdit常用快捷键
    Spring定时器StopWatch
    mybatis 教程(mybatis in action)
    Java中的session详解
    关于OutOfMemoryError的处理
    安卓版本和Api Level
    android通过adb wireless的使用
    adb端口被占用情况下如何杀掉进程
    解决Install failed uid changed
  • 原文地址:https://www.cnblogs.com/chensv/p/14292915.html
Copyright © 2020-2023  润新知