「这是我参与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