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 相关文章推荐
接收键盘指令的脚本
Jun 26 Javascript
JavaScript等比例缩放图片控制超出范围的图片
Aug 06 Javascript
javascript图片相似度算法实现 js实现直方图和向量算法
Jan 14 Javascript
js 动态修改css文件的方法
Aug 05 Javascript
jQuery表格插件datatables用法详解
Nov 23 Javascript
JavaScript地理位置信息API
Jun 11 Javascript
JS计算距当前时间的时间差实例
Dec 29 Javascript
vue将时间戳转换成自定义时间格式的方法
Mar 02 Javascript
JavaScript DOM元素常见操作详解【添加、删除、修改等】
May 09 Javascript
详解Vue一个案例引发「内容分发slot」的最全总结
Dec 02 Javascript
微信小程序云开发之使用云存储
May 17 Javascript
详解关闭令人抓狂的ESlint 语法检测配置方法
Oct 28 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
一个PHP日历程序
2006/12/06 PHP
PHP Array交叉表实现代码
2010/08/05 PHP
php删除左端与右端空格的方法
2014/11/29 PHP
360搜索引擎自动收录php改写方案
2018/04/28 PHP
JavaScript asp.net 获取当前超链接中的文本
2009/04/14 Javascript
jQuery中even选择器的定义和用法
2014/12/23 Javascript
在JavaScript中处理时间之getHours()方法的使用
2015/06/10 Javascript
iscroll.js的上拉下拉刷新时无法回弹的解决方法
2016/02/18 Javascript
浅析Bootstrip的select控件绑定数据的问题
2016/05/10 Javascript
微信小程序 slider 详解及实例代码
2017/01/10 Javascript
使用vue-cli编写vue插件的方法
2018/02/26 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
2018/04/19 Javascript
详解Nodejs mongoose
2018/06/10 NodeJs
详解Vue-cli中的静态资源管理(src/assets和static/的区别)
2018/06/19 Javascript
vue项目中使用tinymce编辑器的步骤详解
2018/09/11 Javascript
解决vue项目,npm run build后,报路径错的问题
2020/08/13 Javascript
[01:07:21]NAVI vs VG Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
Python基本数据类型详细介绍
2014/03/11 Python
使用graphics.py实现2048小游戏
2015/03/10 Python
python爬虫 使用真实浏览器打开网页的两种方法总结
2018/04/21 Python
Python socket实现的文件下载器功能示例
2019/11/15 Python
Pytorch中膨胀卷积的用法详解
2020/01/07 Python
使用Django搭建网站实现商品分页功能
2020/05/22 Python
Python安装并操作redis实现流程详解
2020/10/13 Python
django inspectdb 操作已有数据库数据的使用步骤
2021/02/07 Python
python包的导入方式总结
2021/03/02 Python
iPhoneX安全区域(Safe Area)底部小黑条在微信小程序和H5的屏幕适配
2020/04/08 HTML / CSS
环法自行车赛官方商店:Le Tour de France
2017/08/27 全球购物
美国体育用品商店:Paragon Sports
2017/10/08 全球购物
Tessabit美国:集世界奢侈品和设计师品牌的意大利精品买手店
2020/06/29 全球购物
数控技术专业毕业自荐书范文
2014/02/05 职场文书
婚假请假条怎么写
2014/04/10 职场文书
领导干部四风问题自我剖析材料
2014/09/25 职场文书
班主任远程培训研修日志
2015/11/13 职场文书
服务行业标语口号
2015/12/26 职场文书
苹果macOS 13开发者预览版Beta 8发布 正式版10月发布
2022/09/23 数码科技