就比如很多人会百度许多资料直到通过递归循环拷贝可以实现深拷贝,至于为什么是这样,不明白原理。
那么今天就带你解开深拷贝神秘的面纱。
这就涉及到一道面试题,看似没什么软用,实则非常有用的一道面试题目。
js基本数据类型一共有六种:五种简单数据类型和一种复杂数据类型:
五种简单数据类型包括:String、Number、Boolean、undefined、Null
一种复杂数据类型:obeject
js有8种数据类型 六种基本数据类型+symbol+bigInt
ES6 中新增了一种 Symbol 。这种类型的对象永不相等,即始创建的时候传入相同的值,可以解决属性名冲突的问题,做为标记。
谷歌67版本中还出现了一种 bigInt。是指安全存储、操作大整数。(但是很多人不把这个做为一个类型)。
引用类型有 Array Date Function
基本数据类型是指存放在栈中的简单数据段,数据大小确定,内存空间大小可以分配,它们是直接按值存放的,所以可以直接按值访问
引用类型是存放在堆内存中的对象,变量其实是保存的在栈内存中的一个指针(保存的是堆内存中的引用地址),这个指针指向堆内存。
引用类型数据在栈内存中保存的实际上是对象在堆内存中的引用地址。通过这个引用地址可以快速查找到保存中堆内存中的对象
面试的时候你就简单记忆就好了 ,五种简单数据类型存的是值,引用类型和object存的是内存地址(会指向它本身)
递归拷贝你可以理解把数组 或者对象完全剥开,因为递归拷贝会反复取遍历里面的内容。
完全遍历那么里面拿到的值 一定不是引用类型或者object
最后一定就是基本数据类型 那自然而然拿到的值就是深拷贝。
这样我们就不难理解为什么 Object.assign slice 只能进行简单的深拷贝。
因为它只能剥开一层的值 如果对象里面还有对象那就无法剥开
所以深拷贝的原理就是用到了数据的基本类型。