接收值的方法(拷贝)

state: {
    // Reducer
    test: 'Dva 数据流:dashboard/test',
    data: [],
    num: 1,
    list: ['好好学习天天向上', 'good good study, day day up'],
    tableDate: [
      { id: 1, name: '张三', sex: '', age: 22, birthday: '02-20', score: 90 },
      { id: 1, name: '张三', sex: '', age: 22, birthday: '02-20', score: 90 },
      { id: 1, name: '张三', sex: '', age: 22, birthday: '02-20', score: 90 },
      { id: 1, name: '张三', sex: '', age: 22, birthday: '02-20', score: 90 },
      { id: 1, name: '张三', sex: '', age: 22, birthday: '02-20', score: 90 },
      { id: 1, name: '张三', sex: '', age: 22, birthday: '02-20', score: 90 },
    ],
  },
const { test = '', list = [], num = 0, dispatch } = props;

//接收对象类型的对象值

解构赋值取值

 

 

const 新数组=[value, ...tableData] //value:对象 tabkeData:数组 该写法将value合并到数组中

 

const newData = [...tableData];//如果涉及对象的数组显示不正常则换用该方式赋值几乎能解决绝大多数   dataSource 不正常显示

浅拷贝:

浅拷贝就是只拷贝一层对象,如果有多层对象类型则需要使用深拷贝

Object.assign

bject.assign(obj, source);
//Object.assign 是 Object 的一个方法,该方法可以用于 JS 对象的合并等多个用途,其中一个用途就是可以进行浅拷贝。该方法的第一个参数是拷贝的目标对象,后面的参数是拷贝的来源对象(
也可以是多个来源)。
  • 它不会拷贝对象的继承属性;
  • 它不会拷贝对象的不可枚举的属性;
  • 可以拷贝 Symbol 类型的属性。

扩展运算符

const obj = {...source};

上述代码和使用Object.assign功能相同,其注意事项也相同,两者在使用上基本是可以相互转换

 

Array.prototype.concat

数组的 concat 方法其实也是浅拷贝,使用场景比较少,使用concat连接一个含有引用类型的数组时,需要注意修改原数组中的元素的属性,因为它会影响拷贝之后连接的数组

Array.prototype.slice

数组的 slice 方法其实也是浅拷贝,使用场景比较少,同cancat

使用第三方库&手动实现

深拷贝

深拷贝就不会像浅拷贝那样只拷贝一层,而是有多少层我就拷贝多少层

基本数据类型:直接赋值即可

引用数据类型:

1、使用JSON.stringify()以及JSON.parse()

let _tmp = JSON.stringify(obj);//将对象转换为json字符串形式

let result = JSON.parse(_tmp);//将转换而来的字符串转换为原生js对象

const obj=JSON.parse(JSON.stringify(object))

2、通过for in实现

function deepCopy1(obj) {
  let o = {}
  for(let key in obj) {
    o[key] = obj[key]
  }
  return o
}
 
let obj = {
  a:1,
  b: undefined,
  c:function() {},
}
console.log(deepCopy1(obj))

3、递归    (自身调用自身)

使用递归的方式实现数组、对象的深拷贝

function deepClone1(obj) {
  //判断拷贝的要进行深拷贝的是数组还是对象,是数组的话进行数组拷贝,对象的话进行对象拷贝
  var objClone = Array.isArray(obj) ? [] : {};
  //进行深拷贝的不能为空,并且是对象或者是
  if (obj && typeof obj === "object") {
    for (key in obj) {
      if (obj.hasOwnProperty(key)) {
        if (obj[key] && typeof obj[key] === "object") {
          objClone[key] = deepClone1(obj[key]);
        } else {
          objClone[key] = obj[key];
        }
      }
    }
  }
  return objClone;
}

4.concat(数组的深拷贝)

使用concat合并数组,会返回一个新的数组。
对象是一个引用数据类型 普通的复制是一个浅拷贝

 

 

posted @ 2022-06-24 09:34  SimoonJia  阅读(31)  评论(0编辑  收藏  举报