JS浅拷贝和深拷贝原理与实现方法分析


Posted in Javascript onFebruary 28, 2019

本文实例讲述了JS浅拷贝和深拷贝原理与实现方法。分享给大家供大家参考,具体如下:

浅拷贝只会拷贝一层,深层的引用类型改变还是会受到影响。

深拷贝是所有内部的属性还有值都被拷贝了一份,不管深层的引用类型怎么改都不会受到影响。

浅拷贝的实现方式

1、自定义函数

function shallowClone (initalObj) {
   var obj = {};
   for ( var i in initalObj) {
    obj[i] = initalObj[i];
   }
   return obj;
}

2、ES6 的 Object.assign()

let newObj = Object.assign({}, obj);

3、ES6 的对象扩展

let newObj = {...obj};

深拷贝的实现方式

1、JSON.stringify 和 JSON.parse

JSON.stringify 把对象转换成字符串,再用 JSON.parse 把字符串转换成新的对象。

可以转成 JSON 格式的对象才能使用这种方法,如果对象中包含 function 或 RegExp 这些就不能用这种方法了。

let newObj = JSON.parse(JSON.stringify(obj));

2、jquery 和 zepto

jquery 和 zepto 里的 $.extend 方法可以用作深拷贝。

var $ = require('jquery');
var newObj = $.extend(true, {}, obj);

3、lodash

用 lodash 函数库提供的 _.cloneDeep 方法实现深拷贝。

var _ = require('lodash');
var newObj = _.cloneDeep(obj);

4. 自己封装

deepClone = (obj) => {
    let objClone = Array.isArray(obj)?[]:{};
    if(obj && typeof obj==="object"){
      // for...in 会把继承的属性一起遍历
      for(let key in obj){
        // 判断是不是自有属性,而不是继承属性
        if(obj.hasOwnProperty(key)){
          //判断ojb子元素是否为对象或数组,如果是,递归复制
          if(obj[key]&&typeof obj[key] ==="object"){
            objClone[key] = this.deepClone(obj[key]);
          }else{
            //如果不是,简单复制
            objClone[key] = obj[key];
          }
        }
      }
    }
    return objClone;
}

参考:https://3water.com/article/99013.htm

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
在线编辑器中换行与内容自动提取
Apr 24 Javascript
js function使用心得
May 10 Javascript
实现图片预加载的三大方法及优缺点分析
Nov 19 Javascript
JavaScript随机打乱数组顺序之随机洗牌算法
Aug 02 Javascript
json与jsonp知识小结(推荐)
Aug 16 Javascript
jQuery插件JWPlayer视频播放器用法实例分析
Jan 11 Javascript
jQuery 判断元素整理汇总
Feb 28 Javascript
VUE多层路由嵌套实现代码
May 15 Javascript
原生js中ajax访问的实例详解
Sep 19 Javascript
vue图片上传本地预览组件使用详解
Feb 20 Javascript
分享8个JavaScript库可更好地处理本地存储
Oct 12 Javascript
vue3+typescript实现图片懒加载插件
Oct 26 Javascript
微信小程序搜索功能(附:小程序前端+PHP后端)
Feb 28 #Javascript
详解写好JS条件语句的5条守则
Feb 28 #Javascript
JS判断两个数组或对象是否相同的方法示例
Feb 28 #Javascript
jQuery.parseJSON()函数详解
Feb 28 #jQuery
js获取form表单中name属性的值
Feb 27 #Javascript
用VueJS写一个Chrome浏览器插件的实现方法
Feb 27 #Javascript
jQuery each和js forEach用法比较
Feb 27 #jQuery
You might like
最省空间的计数器
2006/10/09 PHP
PHP异步调用socket实现代码
2012/01/12 PHP
标准PHP的AES加密算法类
2015/03/12 PHP
php版微信公众号自定义分享内容实现方法
2016/09/22 PHP
php中时间函数date及常用的时间计算
2017/05/12 PHP
ThinkPhP+Apache+PHPstorm整合框架流程图解
2020/11/23 PHP
WebGame《逆转裁判》完整版 代码下载(1月24日更新)
2007/01/29 Javascript
基于jQuery的为attr添加id title等效果的实现代码
2011/04/20 Javascript
简短几句jquery代码的实现一个图片向上滚动切换
2011/09/02 Javascript
优化javascript的执行效率一些方法总结
2013/12/25 Javascript
Javascript removeChild()删除节点及删除子节点的方法
2015/12/27 Javascript
JS遍历对象属性的方法示例
2017/01/10 Javascript
canvas绘制多边形
2017/02/24 Javascript
vue中element组件样式修改无效的解决方法
2018/02/03 Javascript
python双向链表实现实例代码
2013/11/21 Python
python网页请求urllib2模块简单封装代码
2014/02/07 Python
将Python代码打包为jar软件的简单方法
2015/08/04 Python
python itchat实现微信好友头像拼接图的示例代码
2017/08/14 Python
Python实现矩阵加法和乘法的方法分析
2017/12/19 Python
python爬虫爬取快手视频多线程下载功能
2018/02/28 Python
Python之使用adb shell命令启动应用的方法详解
2019/01/07 Python
Python制作exe文件简单流程
2019/01/24 Python
python登录WeChat 实现自动回复实例详解
2019/05/28 Python
Python 脚本的三种执行方式小结
2019/12/21 Python
Python进程的通信Queue、Pipe实例分析
2020/03/30 Python
巴西补充剂和维生素购物网站:Natue
2019/06/17 全球购物
荷兰DOD药房中文官网:DeOnlineDrogist
2020/12/27 全球购物
如何开发一个JQuery插件
2016/07/28 面试题
印刷工程专业应届生求职信
2013/09/29 职场文书
计算机专业毕业生自荐信
2013/12/31 职场文书
大学英语演讲稿范文
2014/04/24 职场文书
学习“七一”讲话精神体会
2014/07/08 职场文书
北京颐和园导游词
2015/01/30 职场文书
python中__slots__节约内存的具体做法
2021/07/04 Python
Nginx配置根据url参数重定向
2022/04/11 Servers
python绘制简单直方图(质量分布图)的方法
2022/04/21 Python