浅拷贝 深拷贝

数据类型

数据分为基本数据类型(String, Number, Boolean, Null, Undefined,Symbol) 和 对象数据类型

基本数据类型的特点:直接存储在栈(stack)中的数据

引用数据类型的特点:存储的是该对象在栈中引用,真实的数据存放在 堆内存里

深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的

浅拷贝只复制指向某个对象的指针,新旧对象还是共享同一块内存,修改新对象会改到原对象。

要是{name:“wn”,friend:{ age:18}} name是基本数据 修改 不会影响 friend 为引用数据 会改到原对象

但深拷贝会赋值一个一模一样的对象,新旧对象 不共享内存,修改新对象不会改到原对象。

浅拷贝方式

= 直接赋值

let a = {
    name: 'jack',
    age: 22,
    girlFriends:{
        first:  'lili',
        second: 'lisa',
        third:  'alice'
    }
}

let obj = a;

Object.assign()

let a = {
    name: 'jack',
    age: 22,
    girlFriends:{
        first:  'lili',
        second: 'lisa',
        third:  'alice'
    }
}

let obj = Object.assign({},a);
// 基本数据类型相当于深拷贝  复杂数据类型 是浅拷贝 一改同改

Array.prototype.concat()

let arr = [1,32,{name: 'jack'}];
let newArr = arr.concat();

Array.prototype.slice()

let arr = [1,32,{name: 'jack'}];
let newArr = arr.slice();

解构进行拷贝

对一维数组使用解构,进行拷贝,结果是深拷贝

let arr = [1, 2, 3];
let newArr = [...arr];

对多维数组使用解构,进行拷贝,结果是浅拷贝

let arr = [[1, 2, 3], [4, 5, 6]];
let newArr = [...arr];

深拷贝方式

JSON.parse(JSON.stringify()) – 不能处理函数

let arr = [1,2,{name:'jack'}];
let newArr = JSON.parse(JSON.stringify(arr));

手写递归

1

function deepCopy(newobj, oldobj) {
  for (var key in oldobj) {
    // 判断是否为复杂数据类型  数组    数组属于object所以在前面
    if (oldobj[key] instanceof Array) {
      newobj[key] = []
      deepCopy(newobj[key], oldobj[key])
      // 判断是否为复杂数据类型   对象
    } else if (oldobj[key] instanceof Object) {
      newobj[key] = {}
      deepCopy(newobj[key], oldobj[key])
    } else {
      newobj[key] = oldobj[key]
    }
  }
}
deepCopy({}, obj)

2

typeof [] == "object"
typeof {} == "object"
// 键值  形式 的数组[ ["0","1"],["1","2"] ]   所有转换成键值对   ""
Object.entries(["aa", "bb"])
Object.entries({ name: "andy", age: 18 })
// ========
function Copy(obj) {
  let targetObj = obj instanceof Array ? [] : {}
  for (const [k, v] of Object.entries(obj)) {
    targetObj[k] = typeof v == "object" ? Copy(v) : v
  }
  return targetObj
}

let newObj = Copy(obj)

lodash库完成深拷贝

let obj = {
            name:'老虎',
            age:'18',
            hobby:['吃肉','睡觉']
        }
        let obj2 = _.cloneDeep(obj)   //使用lodash库的方法 cloneDeep

你可能感兴趣的:(前端,#,js,#,TS,数学建模)