美文网首页
Object.assign 是深拷贝?是浅拷贝?

Object.assign 是深拷贝?是浅拷贝?

作者: microkof | 来源:发表于2020-01-10 17:23 被阅读0次

前言

前天,一次面试,一个挺专业的面试官问我,如何用原生js方法简单实现深拷贝?

我一脸问号,有么?然后面试官暗示了我半天,我说,莫非你是指Object.assign?

我就有点流汗,从没听说Object.assign跟深拷贝有什么关系,我又孤陋寡闻了?

测试

赶紧查了查资料,经过测试得知,Object.assign 是浅拷贝。测试代码如下:

let a = {name: {asd: '123'}};
let b = Object.assign({}, a);
a = {w: []};
console.log(a); // w: []

let m = {name: {asd: '123'}};
let n = Object.assign({}, m);
m.name = [];
console.log(n); // name: {asd: "123"}

let x = {name: {asd: '123'}};
let y = Object.assign({}, x);
x.name.asd = 456;
console.log(y); // name: {asd: 456}

let p = {name: {asd: {xyz: '123'}}};
let q = Object.assign({}, p);
p.name.asd.xyz = 456;
console.log(p); // name: asd: {xyz: 456}

结论

所以结论是:

Object.assign的拷贝,是对于第一层属性的拷贝,所以是浅拷贝。

先用Object.freeze冻结原对象行不行?

那就要了解一下Object.freeze冻结原理,测试过程我就不说了,结论是:

Object.freeze也是只能冻结第一层属性。

所以不要有“用Object.freeze先冻结再深拷贝”的念头!

怎样才是严谨的深拷贝?

严谨是一个相对概念,深拷贝的写法也有N种,我个人是采用3种办法,一个是JSON.parse(JSON.stringify(obj)),一个是去github上找一个深拷贝的开源代码,或者是使用lodash的深拷贝就得了。

相关文章

  • ☘️lodash的merge与Object.assgin的区别

    Object.assign() --- 是浅拷贝 lodash的_.merge() --- 是深拷贝 一、Obje...

  • es6(...运算符)

    ...运算符可用于浅拷贝 深拷贝 用Object.assign(obj)实现深拷贝 浅拷贝 当然,我们也可以在浅拷...

  • js 对象拷贝 浅拷贝 深拷贝

    浅拷贝 Object.assign(target, source) 扩展运算符(...) 深拷贝 乞丐版的深拷贝 ...

  • 2020-11-17

    浅拷贝,深拷贝针对深拷贝,需要使用其他办法,因为 Object.assign()拷贝的是属性值。假如源对象的属性值...

  • js 深浅拷贝

    深拷贝 更好的写法: 浅拷贝 浅拷贝,还可以用 Object.assign 、展开运算符 ...

  • 深拷贝&浅拷贝

    浅拷贝:Object.assign({},obj);解构赋值(...) 深拷贝:递归遍历JSON.parse() ...

  • 如何实现拷贝

    没理解深拷贝与浅拷贝的点这里 实现浅拷贝 Object.assign ES6中拷贝对象的方法,第一个参数是新对象,...

  • js浅拷贝和深拷贝

    1⃣️ 浅拷贝 直接赋值 Object.assign 2⃣️ 深拷贝 JSON.stringify & JSON....

  • Object.assign 是深拷贝?是浅拷贝?

    前言 前天,一次面试,一个挺专业的面试官问我,如何用原生js方法简单实现深拷贝? 我一脸问号,有么?然后面试官暗示...

  • iOS--拷贝相关题

    1、什么是深拷贝什么是浅拷贝?浅拷贝和深拷贝的区别 * 浅拷贝(shallow copy):指针拷贝,对于被拷贝对...

网友评论

      本文标题:Object.assign 是深拷贝?是浅拷贝?

      本文链接:https://www.haomeiwen.com/subject/fdkmactx.html