面试必考知识点:深拷贝(包含一维深拷贝,二维是浅拷贝)

394 阅读2分钟

知识点:深拷贝

深浅拷贝:

浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。

仅仅是复制了引用,彼此之间的操作会互相影响

深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。

在堆中重新分配内存,不同的地址,相同的值,互不影响

数组类常见方法

  • 方法一:Array.prototype.slice()函数(一维深拷贝,二维的是浅拷贝)
    let arr = ['memo', 'fire', 'bug'];
    let arrCopy = arr.slice(0);
    arrCopy[0] = 'rocket';

    console.log(arr);//["memo", "fire", "bug"]
    console.log(arrCopy);//["rocket", "fire", "bug"]
  • 方法二:Array.prototype.concat()函数(一维深拷贝,二维的是浅拷贝)
    let arr = ['memo', 'fire', 'bug'];
    let arrCopy = arr.concat();
    arrCopy[0] = 'rocket';

    console.log(arr); // ["memo", "fire", "bug"]
    console.log(arrCopy); // ["rocket", "fire", "bug"]

其实Array的slice和concat方法并不是真正的深拷贝, 对于Array的第一层的元素是深拷贝,而Array的第二层 slice和concat方法是复制引用。

let a = [[1, 2], 3, 4];
let b = a.concat();
console.log(a === b); // false

a[0][0] = 0;
console.log(a); // [[0, 2], 3, 4]
console.log(b); // [[0, 2], 3, 4]

对象类常见方法

  • 方法一:JSON法 (完全的深拷贝)

JSON.parse(JSON.stringify(obj))

JSON.stringify():把一个js对象序列化为一个JSON字符串 JSON.parse():把JSON字符串反序列化为一个js对象

let a = {a:1,b:{cd:2,ef:3}};
let b = JSON.parse(JSON.stringify(a));
a.a=11;
a.b.cd=22;
console.log(JSON.stringify(a));//{"a":11,"b":{"cd":22,"ef":3}}
console.log(JSON.stringify(b));//{"a":1,"b":{"cd":2,"ef":3}}

PS: 不过 Json压缩不可靠,fn会被过滤

  • 方法二:ES6 assign大法

Object.assign({}, obj)(一维深拷贝,二维是浅拷贝)

let a = {a:1,b:{cd:2,ef:3}};
let b = Object.assign({},a);
a.a=11;
a.b.cd=22;
console.log(JSON.stringify(a));//{"a":11,"b":{"cd":22,"ef":3}}
console.log(JSON.stringify(b));//{"a":1,"b":{"cd":22,"ef":3}}

  • 方法三:ES6 ...法(一维深拷贝,二维是浅拷贝)
let a = {a:1,b:{cd:2,ef:3}};
let b = {...a};
a.a=11;
a.b.cd=22;
console.log(JSON.stringify(a));//{"a":11,"b":{"cd":22,"ef":3}}
console.log(JSON.stringify(b));//{"a":1,"b":{"cd":22,"ef":3}}

每日笔耕打卡,系列文档精耕细作 欢迎mark,共同进步。 github地址