Js的深拷贝和浅拷贝

一、数据类型

数据分为基本数据类型(String, Number, Boolean, Null, Undefined,Symbol)和对象数据类型object(object、array、function、data)。

1、基本数据类型的特点:直接存储在栈(stack)中的数据

var a = 100;
b = a; // 栈内存会开辟一个新的内存空间,此时b和a都是相互独立的
b = 200;
console.log(a); // 100

2、引用数据类型的特点:存储的是该对象在栈中引用,真实的数据存放在堆内存里

var message = {

            name: "Steven",

            age: 24

        };

        var Data = Message;

        Message.age = "25";

        console.log(Data.age);  // 25

        console.log( Message.age); // 25

深浅拷贝原理图
Js的深拷贝和浅拷贝

Js的深拷贝和浅拷贝

二、实现浅拷贝的方法

1.Object.assign()

const obj = Object.assign(target, source);

2.扩展运算符…

const a = { aaa: 1, bbb: 2, ccc: [1, 2, 3] };
const b = {...a }
console.log(b); //{ aaa: 1, bbb: 2, ccc: [ 1, 2, 3 ] }

3.Array的concat(),concat() 方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组

const array1 = ['a', 'b', 'c'];
const array2 = ['d', 'e', 'f'];
const array3 = array1.concat(array2);
console.log(array3);
// expected output: Array ["a", "b", "c", "d", "e", "f"]

4.Array的slice(),slice() 方法返回一个新的数组对象,这一对象是一个由 begin 和 end 决定的原数组的浅拷贝(包括 begin,不包括end)。原始数组不会被改变

const a = [1, 2, { 3: 'a' }];
const b = a.slice();
console.log(b); //[ 1, 2, { '3': 'a' } ]

三、深拷贝的方法

1.递归实现
深度克隆原理:遍历对象,数组直到里面都是基本数据类型,然后再去复制,就是深度拷贝

// 递归方式实现深拷贝
function DeepCopy(obj) {
    var return_obj = {};
    for (let key in obj) {
       if (Object.prototype.toString.call(obj[key]) === '[Object Object]') {
         return_obj[key] = DeepCopy(obj[key]);  
       } else {
        return_obj[key] = {...obj[key]};  // es6的扩展运算符,处理当前层次赋值为深拷贝
       }
   }
   return return_obj;
}

2.第三方库可以使用loadash

let  fun = require('lodash'); 
let a = [1, 2, {3 : 'a' }]; 
let b = fun.cloneDeep(a)
上一篇:利用nginx解决Nuget无法访问的问题


下一篇:VS2010安装RestSharp