Js中对象的深拷贝和浅拷贝
浅拷贝:只拷贝对象的基础属性值,对属性值为对象或数组的属性则拷贝指针。
深拷贝:拷贝对象的所有属性作为一个全新的对象。拷贝前后的对象互不影响。
浅拷贝仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么深拷贝出来的对象也会相应改变。
一、对象引用
对象引用容易理解,直接赋值,修改复制后的数组,原对象会随之改变。
//对象引用
var boy = {age:18}
var girl = boy;
console.log(boy === girl);//true
girl.age = 20;
console.log(boy.age);//20
理解:使用“=”进行赋值,girl和boy指向了同一内容地址,修改一个,另一个也会修改。
二、浅拷贝
使用Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
//浅拷贝
var boy = {age:18}
var girl = Object.assign({}, boy);
console.log(boy === girl);//false
girl.age = 20;
console.log(boy.age);//18
理解:上述代码将原始对象拷贝到一个空对象,就得到原始对象的克隆,原对象和拷贝对象指向不同的内存地址,修改原对象和克隆对象,互补影响。
var boy = {age:18,address:{home:'北京'}
}
var girl = Object.assign({}, boy);
console.log(boy === girl);//false
girl.address.home = '上海';
console.log(boy.address.home);//上海
理解:上述代码将原始对象拷贝到一个空对象,就得到原始对象的克隆。因为Object.assign()只是浅拷贝girl.address是对栈对象的引用,因此内层对象的修改会影响原始对象。
三、深拷贝
1、JSON.parse()与JSON.stringify()深拷贝
可以通过JSON对象的方法,来进行对象的深拷贝,代码如下:
//纯数据json对象的深度克隆
function deepClone(obj) {return JSON.parse(JSON.stringify(obj));
}
理解:通过对象符串化和字符串对象化进行对象的拷贝。此方法只使用与纯JSON对象的深拷贝
2、对象遍历
//包含其他负责的内容 date对象 null undefined
var obj1={name:"张三",age:20,height:[12,26,46],address:{home:'北京'},birthday:new Date(),father:null,mother:undefined,school:[{middleschool:'北大附中',},{university:'清华大学',}]}function clone(obj) { if(obj === null) return null if(typeof obj !== 'object') return obj;if(obj.constructor === Date) return new Date(obj); if(obj.constructor === RegExp) return new RegExp(obj);var newObj = new obj.constructor (); //保持继承链for (var key in obj) {if (obj.hasOwnProperty(key)) { //不遍历其原型链上的属性var val = obj[key];newObj[key] = typeof val === 'object' ? arguments.callee(val) : val; // 使用arguments.callee解除与函数名的耦合}} return newObj; }; console.log(obj1);console.log(clone(obj1));
理解:
(1)、用 new obj.constructor ()构造函数新建一个空的对象,可以保持原形链的继承;
(2)、用obj.hasOwnProperty(key)来判断属性是否来自原型链上,因为for..in..也会遍历其原型链上的可枚举属性。
(3)、函数用到递归算法,在函数有名字,而且名字以后也不会变的情况下,这样定义没有问题。但问题是这个函数的执行与函数名 factorial 紧紧耦合在了一起。为了消除这种紧密耦合的现象,需要使用 arguments.callee。
参考:https://www.cnblogs.com/wangyulue/articles/7684515.html
Js中对象的深拷贝和浅拷贝相关推荐
- PHP中对象的深拷贝与浅拷贝
2019独角兽企业重金招聘Python工程师标准>>> 最近写了一个php脚本,在脚本中使用到了SplPriorityQueue,会用到两次 因此写了如下: $res=$tmp_re ...
- 一文搞懂前端对象的深拷贝与浅拷贝
在前端开发过程中常常会听到对象的深拷贝与浅拷贝,对于初学者来说,可能是傻傻的分不清楚,本人将详细介绍javascript中对象的深拷贝与浅拷贝. 一.javascript中的数据类型 基础数据类型 字 ...
- JS 中对象的深浅拷贝(ES3、ES5、ES6不同方法底层实现,一文搞清楚深浅拷贝面试常问题)
JS 中对象的深浅拷贝 拷贝我们都知道这个词的意思,我们经常做过复制.粘贴的操作,其中的复制就是拷贝,那么在拷贝的时候,如果我们复制出来的内容和原内容是完全的分开,各自不相影响,那么这就属于深拷贝 ...
- vue对象深拷贝_JavaScript 中对象的深拷贝
对象的深拷贝与浅拷贝的区别如下: 浅拷贝:仅仅复制对象的引用,而不是对象本身: 深拷贝:把复制的对象所引用的全部对象都复制一遍. 一. 浅拷贝的实现 浅拷贝的实现方法比较简单,只要使用是简单的复制语句 ...
- python深拷贝一个对象_Python对象的深拷贝和浅拷贝详解
本文内容是在<Python核心编程2>上看到的,感觉很有用便写出来,给大家参考参考! 浅拷贝 首先我们使用两种方式来拷贝对象,一种是切片,另外一种是工厂方法.然后使用id函数来看看它们的标 ...
- Python基础:对象的深拷贝和浅拷贝的区别
Python基础:对象的深拷贝和浅拷贝的区别 1 变量与对象 2 不可变对象与可变对象 3 直接赋值 4 浅拷贝 5 深拷贝 参考文献 1 变量与对象 对象:内存中存储数据的实体,有明确的类型.在Py ...
- java 复制Map对象(深拷贝与浅拷贝)
java 复制Map对象(深拷贝与浅拷贝) CreationTime--2018年6月4日10点00分 Author:Marydon 1.深拷贝与浅拷贝 浅拷贝:只复制对象的引用,两个引用仍然指向同一 ...
- 浅谈对象的深拷贝和浅拷贝
浅谈对象的深拷贝和浅拷贝 一.为什么使用对象的拷贝? 1.在普通数据类型赋值 let a=10let b=aa=20console.log(a)//a=20console.log(a)//b=10 因 ...
- JS中对象按属性排序(冒泡排序)
原文地址 https://www.cnblogs.com/it-Ren/p/10898947.html 一路向北√ 越努力,越幸运. JS中对象按属性排序(冒泡排序) 冒泡排序:它重复地走访过要排序的 ...
最新文章
- Tensorflow—Fetch and Feed
- java linkedlist源码_Java集合之LinkedList源码分析
- webpack打包测试_webpack入门笔记(一)
- 论程序员如何规划职业路线?网友:从码农到工程师?
- python函数分为哪几种_python数据挖掘常用工具有哪几种?
- 【洛谷 P1772】 [ZJOI2006]物流运输(Spfa,dp)
- An internal error occurred during: Android Library Update.
- git 远程代码回滚master
- centos挂载ntfs文件系统
- 使用Lens管理多云Kubernetes
- Qt之Cannot retrieve debugging output.
- 荣耀4a鸿蒙,赵明:6 月起芯片供应将全面恢复,荣耀未来会考虑用华为鸿蒙系统...
- 微信小程序——VW、VH
- 百度地图 ( 一 ) 显示地图
- 程序设计思维与实践 Week15 作业A - ZJM 与霍格沃兹
- #loj3059 HNOI2019 序列
- 【DaVinci Developer专题】-38-Exclusive Area介绍+配置
- 运营技巧|APP如何提升用户粘性与用户留存率
- php 图片合成gif,php合并图片,生成gif动态图片,保存到指定目录
- php 求根,PHP如何求一元二次方程的根?