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}//示例2let obj1 = {name:"zhangsan"};
let obj2 = {age:18};
let obj3 = Object.assign({},obj1,obj2);
console.log(obj3) //{name: "zhangsan", age: 18}
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 }

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

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}

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

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

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

let obj = {username: 'kobe'
};
let obj2 = Object.assign({},obj);
obj2.username = '李世民';
console.log(obj);//{username: "kobe"}
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.用 JSON.stringify 把对象转换成字符串,再用 JSON.parse 把字符串转换成新的对象,
但是需要注意的是,可以转成 JSON 格式的对象才能使用这种方法,如果对象中包含 function 或 RegExp 这些就不能用这种方法了。

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

ES6之object.assign()是深拷贝还是浅拷贝相关推荐

  1. Object.assign()是深拷贝还是浅拷贝?

    Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象.它将返回目标对象. Object.assign()拷贝的是属性值. 假如源对象的属性值是一个对象的引用,那 ...

  2. ES6之Object.assign()用法,Object.assign()到底是浅拷贝还是深拷贝?

    基本用法 Object.assign方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target). const target = { a: 1 }; const sou ...

  3. object.assign()是深拷贝?还是浅拷贝?

    对于Object.assign()而言,如果对象的属性值为简单类型(string,number),通过Object.assign({},srcobj),得到的新对象为深拷贝:如果属性值是对象或其他引用 ...

  4. Vue前端Es6语法Object.assign()

    定义:Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象分配到目标对象.它将返回目标对象. 语法: Object.assign(target, -sources) 参数: ...

  5. 纯原生仿ES6的Object.assign,实现深度合并对象

    源码: function isObj(x){ var type = typeof x;return x !== null && (type === 'object' || type = ...

  6. JS的深拷贝和浅拷贝

    今天,CVTE面试官问了深拷贝和浅拷贝的问题 我的回答是:浅拷贝是拷贝了对象的引用,当原对象发生变化的时候,拷贝对象也跟着变化:深拷贝是另外申请了一块内存,内容和原对象一样,更改原对象,拷贝对象不会发 ...

  7. js深拷贝和浅拷贝对数组的影响_javascript之浅拷贝与深拷贝

    好久没提笔写文章了,之前忙得喘不过气,过年回家也无心学习.年后回来后,调整好状态,准备把js基础重新过一遍. 正文从此开始: 之所以写这篇文章是因为Leader最近在面试,回来和我们数落了一通,问一个 ...

  8. Object.assign()方法

    1.对象的扩展 ES6中,对象的属性和方法可简写:对象的属性值可不写,前提是属性名已经声明: var name = "zhangsan";var password = " ...

  9. 深拷贝与浅拷贝是什么?如何实现浅拷贝和深拷贝?

    基于对什么是深拷贝?什么是浅拷贝?如何实现一个深拷贝和浅拷贝?为什么要用到深拷贝?的思考,总结如下,如有不足之处希望多多指教. 什么是浅拷贝? 浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用. A是 ...

最新文章

  1. mysql 切换数据库方案
  2. 网络游戏server编程,第一章笔记
  3. VS2010与SVN
  4. 深度学习之激活函数篇(Sigmoid、tanh、ReLU、PReLU)
  5. pythonUI---ttk.Treeview使用心得(内含表格形式加垂直水平滚轮方法)
  6. mixin风格的bases class
  7. 拓端tecdat|R语言用普通最小二乘OLS,广义相加模型GAM ,样条函数进行逻辑回归LOGISTIC分类
  8. Rust : future库
  9. HDU-2544-最短路(floyd)
  10. 知识表示学习 TransE 代码逻辑梳理 超详细解析
  11. 一文了解plc编程、电脑编程、手机APP编程、组态编程、云编程(下)
  12. java并发编程 pdf_Java并发编程实战 PDF
  13. 实战服务器虚拟化,企业虚拟化实战Vmware篇PDF影印版(张巍著) 56M
  14. java查询SQL Server数据库条数
  15. 手机拍摄证件照可以用什么软件
  16. K线图|K线图分析法简介 |K线图怎么看
  17. 使用封装的API接口,在控制台输出undefined
  18. java liferay,用一个简单的Java code获取当前用户的Liferay
  19. Eclipse 4.2 SR1版悄悄发布
  20. ubuntu16.04 通过bypy上传文件到百度云

热门文章

  1. PayPal Data Scientist 数据科学家面经与工作体验 | 面试笔记
  2. VS SDK更新问题(error MSB8036: 找不到 Windows SDK 版本10.0.14393.0)
  3. Nodejs发送邮箱,nodejs怎样发送给163邮箱,nodemailer模块,发送邮箱错误代码535
  4. STM32双轴摇杆控制空心杯电机
  5. mysql开启数据库审计
  6. 【LSTM回归预测】基于matlab灰狼算法优化LSTM回归预测【含Matlab源码 2038期】
  7. Nature调查 | 85%硕博生存在财务危机,近一半或因此放弃学业
  8. 马云卸任演讲中的“信任”和“责任”
  9. 吉林大学计算机科学郝琳琳,胡亮-吉林大学计算机科学与技术学院
  10. 如何在WordPress中添加Pinterest“ Pin It”按钮(最终指南)