当前位置:   article > 正文

ES6之object.assign()是深拷贝还是浅拷贝_object.assign()的用法 深拷贝

object.assign()的用法 深拷贝

ES6之object.assign()是深拷贝还是浅拷贝

1、概念

浅拷贝——只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。

深拷贝——会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。

在这里插入图片描述

2、Object.assign()
1、基本用法:

Object.assign(目标,数据1,数据2…);

实例

//示例1
let obj = {a:1}
let newObj = Object.assign({},obj);
console.log(newObj) //{a: 1}
 
 
//示例2
 
let obj1 = {name:"zhangsan"};
let obj2 = {age:18};
let obj3 = Object.assign({},obj1,obj2);
console.log(obj3) //{name: "zhangsan", age: 18}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
2、常规用法

1、Object.assign()方法的第一个参数是目标对象,后面的参数都是源对象,Object.assign()方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。

var obj = {};
var o1 = { a: 1 };
var o2 = { b: 2 };

var obj = Object.assign(obj, o1, o2);
console.log(obj); // { a: 1, b: 2 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

注意:如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。

const target = { a: 1, b: 1 };
const source1 = { b: 2, c: 2 };
const source2 = { c: 3 };

Object.assign(target, source1, source2);
console.log(target); // {a:1, b:2, c:3}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。但是 Object.assign() 进行的是浅拷贝,拷贝的是对象的属性的引用,而不是对象本身。

var obj = { a: {a: "kobe", b: 39} };
var initalObj = Object.assign({}, obj);
initalObj.a.a = "李世民";
console.log(obj.a.a); // 李世民
  • 1
  • 2
  • 3
  • 4

注意:当object只有一层的时候,是深拷贝

let obj = {
   username: 'kobe'
};
let obj2 = Object.assign({},obj);
obj2.username = '李世民';
console.log(obj);//{username: "kobe"}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
2、Object.assign是浅拷贝还是深拷贝的问题

即:第一级属性深拷贝,从第二级属性开始就是浅拷贝。

//示例1  一层深拷贝
let obj = {a:1}
let newObj = Object.assign({},obj);
console.log(newObj); //{a: 1}
newObj.a=2;
console.log(obj); //{a:1}
console.log(newObj); //{a: 2}
 
 
//示例2  二层浅拷贝
let obj = {a:1,b:{name:"zhangsan"}}
let newObj = Object.assign({},obj);
console.log(newObj); //{a:1,b:{name:"zhangsan"}}
newObj.b.name="lisi";
console.log(obj); //{a:1,b:{name:"lisi"}}
console.log(newObj); //{a:1,b:{name:"lisi"}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

总结

1.用 JSON.stringify 把对象转换成字符串,再用 JSON.parse 把字符串转换成新的对象,
但是需要注意的是,可以转成 JSON 格式的对象才能使用这种方法,如果对象中包含 function 或 RegExp 这些就不能用这种方法了。

2.Object.assign()拷贝
当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝,但是对象中有对象的时候,此方法,在二级属性以后就是浅拷贝。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/68193
推荐阅读
相关标签
  

闽ICP备14008679号