1.复制运算符 = 实现的是浅拷贝,是拷贝对象的引用值。
2.javaScript 中数组和对象自带的拷贝方法都是“首层深拷贝”
3.JSON.stringify 实现的是深拷贝,但对目标对象有要求(非 undefined ,function,symbol);
4.想真正意义上深拷贝,只能用递归方法实现深层次的拷贝。
浅拷贝是只复制对象的引用(指针),而未复制真正的值,所以拷贝对象发生变化,原对象也会发生对象。
深拷贝就是对目标的完全拷贝,不像浅拷贝那样只是复制了一层引用,就连值也都复制了,深拷贝之后的对象不会对原对象有任何影响,其实就相当于拷贝后的对象是一个完全独立的对象。
浅拷贝经常用的就是通过=赋值实现
深拷贝目前就只有两种方法
1.通过JSON对象的parse 和stringify方法
2.利用递归每层都重新创建新的对象
简单类型 undefined Null Boolean Number string 以及对象变量的指针是存入的栈内存中可直接引用,
栈内存主要用于存储各种基本类型的变量,包括Boolean、Number、String、Undefined、Null,symbol以及对象变量的指针
object array 则是存入堆内存中,指针存到栈内存中用来引用。
堆内存主要负责像对象Object这种变量类型的存储
一般来说栈内存线性有序存储,容量小,系统分配效率高。而堆内存首先要在堆内存新分配存储区域,之后又要把指针存储到栈内存中,效率相对就要低一些了。
垃圾回收方面,栈内存变量基本上用完就回收了,而堆内存中的变量因为存在很多不确定的引用,只有当所有调用的变量全部销毁之后才能回收。
JavaScript中的拷贝方法:
1.concat 只是对数组的第一层进行深拷贝。
2.slice 只是对数组的第一层进行深拷贝。
3.Object.assign() 拷贝的是属性值
4… 实现的是对象第一层的深拷贝。
javaScript 中数组和对象自带的拷贝方法都是“首层深拷贝”