堆存放引用数据类型 栈存放简单数据类型 引用数据类型在栈上储存的是指向堆的地址
    对象,数组是引用数据类型,会在堆里面开辟一个空间存,然后在栈里存一个地址,指向堆
    浅拷贝的时候实际上是拷贝的栈的地址,
    浅拷贝:(for in 循环赋值 / Object.assign(新对象,旧对象))
    可以复制当前一层的内容,深一层的内容无法复制,修改了新的数据之后,原本的数据也会被修改

    1. // 浅拷贝的实现 通过for in实现
    2. var user1 = {
    3. name: "小明",
    4. age: 30,
    5. height: 1.9
    6. };
    7. var user2 = {};
    8. for (var i in user1) {
    9. user2[i] = user1[i]; //user[i]输出的是每一个值,将user1的每一个值赋予给user2对象
    10. }
    11. console.log(user2) //{name: "小明", age: 30, height: 1.9}
    1. // 浅拷贝 通过Object.assign({}, 对象1, 对象2);
    2. // 这一种浅拷贝方式类似于jquery的$.extend({}, 对象1, 对象2)
    3. var obj1 = {
    4. name: "小明",
    5. age: 13
    6. };
    7. var obj2 = {
    8. name: "大王",
    9. tel: 18456888
    10. };
    11. var obj = Object.assign({}, obj1, obj2);
    12. console.log(obj) //{name: "大王", age: 13, tel: 18456888}
    13. // 我们发现这一种方式,相同的key值后一个会覆盖前一个的key值,

    深拷贝就是拷贝堆的内容,
    在复制之后需要对每个成员项 再进行一次数据类型判断 , 以后每一层的数据都会被拷贝实现深拷贝的方法:
    1.通过JSON.转换成字符再转回来
    2.遍历递归
    3.lodash插件

    1. //原数据,包含字符串、对象、函数、数组等不同的类型
    2. var obj = {
    3. name:"test",
    4. main:{
    5. a:1,
    6. b:2
    7. },
    8. fn:function(){
    9. },
    10. friends:[1,2,3,[22,33]]
    11. }
    12. //遍历递归
    13. function deepcopy(obj) {
    14. if (obj instanceof Object) {
    15. const newObj = new obj.constructor();
    16. for (let key in obj) {
    17. newObj[key] = deepcopy(obj[key]);
    18. }
    19. return newObj
    20. }
    21. return obj;
    22. }
    23. const o = deepcopy(obj);
    24. console.log(o.name = "修改成功");
    25. console.log(o);
    26. console.log(obj);
    1. 刘金萍案例
    2. var a = [
    3. {
    4. name: "jinping",
    5. gender: "female",
    6. age: "18",
    7. },
    8. {
    9. name: "qiumo",
    10. gender: "male",
    11. age: "19",
    12. },
    13. ];
    14. //深拷贝1
    15. var b = [];
    16. for (let i = 0; i < a.length; i++) {
    17. b[i] = {...a[i]} ;
    18. }
    19. //深拷贝2
    20. var b = JSON.parse(JSON.stringify(a)) //我们一般用来深拷贝
    21. // 浅拷贝
    22. var c=a;
    23. b[0].name = "huimin";
    24. console.log(a);//深拷贝不变,浅拷贝变
    25. console.log(b);