深拷贝与浅拷贝

88 阅读2分钟

「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

在熟悉深浅拷贝之前我们先熟悉一下与之有关的几个概念:

堆和栈: 堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。

区别:堆:顺序随意栈:后进先出(Last-In/First-Out)

基本数据类型: 指的是简单的数据段,也叫原始数据类型,有6种:number、string、bollean、null、undefined、symbol

以栈的形式存储, 保存与赋值指向数据本身,用type of 来判断类型,存储空间固定

引用数据类型:

引用数据类型主要是对象(函数本质上也是对象),所有的非基本数据类型都是引用数据类型

定义:

浅拷贝: 只拷贝引用指针,不影响原有内存分配,彼此之间的操作会互相影响

深拷贝: 在内存中开辟一块新空间,在堆中重新分配内存,不同的地址,相同的值,互不影响

实现拷贝方式:

浅拷贝:

1. Object.assign

Object.assign方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target) 例:

const target = { a: 1 };

const source1 = { b: 2 };
const source2 = { c: 3 };

Object.assign(target, source1, source2);
target // {a:1, b:2, c:3}

如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性

2. 数组的slice、concat

js的原生方法concat、slice都是仅适用于一维数组,一旦到了二维数组或者多维数组中就会出现问题,就出现拷贝的不够彻底导致还是会发生数据的相互牵引问题,所以也属于浅拷贝

3.扩展运算符(...)

var obj = { name:'小亮', arr: ['学习''打游戏'] };
var obj1 = {...obj}

4.lodash

深拷贝:

1.JSON.parse(JSON.stringify())

一般实现深拷贝的方式,有几个缺陷,例:会忽略 undefined、symbol类型,无法对function进行处理...

2.递归

3.JQuery库的extend

4.loadsh deep