js对象的深拷贝及其的几种方法
深拷贝和浅拷贝是javascript中一个比较复杂的问题,也是面试官最喜欢问的问题之一,通过这个为可以看出是否入门,深拷贝和浅拷贝也是初学者经常犯错一个点。
简单来说深拷贝是拷贝储存在栈中的对象,而浅拷贝是从内存中拷贝,这就涉及到数据存放位置了,总所周知,数据大体可以分为两种数据类型,一种是基本数据类型,数据结构不是很复杂,单独可以存在内存中就可以,而另一种是复杂数据类型,也叫引用数据类型,例如数组和对象,是放在栈中存储的,而基本数据类型是放在内存中的,不涉及深拷贝和浅拷贝,也可以说基本数据类型都是深拷贝
而引用类型数据存储比较复杂,例如var a=[1,3,4] 这句话的存储就是首先在内存开辟一个空间,但是内存当中不可以存储这种复杂数据类型,所以要把这种结构放到栈当中,栈相当于一个密码箱,而钥匙存在内存当中,这就构成了一个存储关系,浅拷贝var b=a简单来说就是把这份钥匙复制了一份,但内存当中的数据并没有复制,所以如果改变a相应b也会改变
而深拷贝则需要在栈中在生成一个密码箱,生成一把新钥匙(钥匙2),这样深拷贝的两种数值不会相互影响,也可以说没有任何关系了
方法:
1:jq使用,$.extend({},obj)
2:Object.assign({},obj)
这两种比较基础,估计都会使用
3:clone(obj)
var clone = function (obj) { return JSON.parse(JSON.stringify(obj)); }
这种方法有种缺陷,这种方法会忽略值为function以及undefied的字段,而且对date类型的支持也不太友好。
4:clone(obj)
var clone = function (obj) {
if(obj === null) return null
if(typeof obj !== 'object') return obj;
if(obj.constructor===Date) return new Date(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;
};
这种方法也就使封装最好的深拷贝的方法,以下为解释:
1、用new obj.constructor ()构造函数新建一个空的对象,而不是使用{}或者[],这样可以保持原形链的继承;
2、用obj.hasOwnProperty(key)来判断属性是否来自原型链上,因为for..in..也会遍历其原型链上的可枚举属性。
3、上面的函数用到递归算法,在函数有名字,而且名字以后也不会变的情况下,这样定义没有问题。但问题是这个函数的执行与函数名 factorial 紧紧耦合在了一起。为了消除这种紧密耦合的现象,需要使用 arguments.callee。
---------------------
作者:zuggs_
来源:CSDN
原文:https://blog.csdn.net/zuggs_/article/details/84784933
版权声明:本文为博主原创文章,转载请附上博文链接!
最新文章
- tensorflow学习笔记二:入门基础
- ffmpeg 常用命令
- 使用Visual Studio扩展插件Visual assist X给代码插入注释模板
- 机器学习&;数据挖掘笔记_13(用htk完成简单的孤立词识别)
- Hive DDL DML SQL操作
- WCF揭秘(一)——简单的WCF开发实例
- VMWare虚拟机USB连接问题
- iOS项目架构文档
- Visual Studio2012 Lua插件--BabeLua
- jquery-plugin-biggerLink,highLight-层加亮_andy 阳光生活_百度空间
- JMETER 不同线程组 变量值 的参数传递
- 【Android Developers Training】 73. 布局变化的动画
- CentOS 下mysql ERROR&;n…
- ActiveMQ的使用
- C# 将datatable导出成Excel
- 如何做好SQLite 使用质量检测,让事故消灭在摇篮里
- SDL 开发实战(二):SDL 2.0 核心 API 解析
- 网络通信实验(1)STM32F4 以太网简介
- TMS320VC5509驱动74HC595芯片
- typename在C++中的用法
热门文章
- 关于学习java虚拟机的知识整理一:jvm内存区域
- nodejs安装管理工具nvm的安装和使用
- git flow开发分支管理模型
- H5_0013:CSS特色样式集
- Python入门11 —— 基本数据类型的操作
- Selenium3+python自动化009- 多选框
- Python标准库之时间模块time与datatime模块详解
- AntDesign(React)学习-14 使用UMI提供的antd模板
- AE创建组件失败,项目中已存在对esri.arcgis.***的引用
- Qt VS Tools插件官方下载及安装