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 相关文章推荐
dojo学习第一天 Tab选项卡 实现
Aug 28 Javascript
VBS通过WMI监视注册表变动的代码
Oct 27 Javascript
JS+DIV实现鼠标划过切换层效果的实例代码
Nov 26 Javascript
js调用浏览器打印模块实现点击按钮触发自定义函数
Mar 21 Javascript
JavaScript中setUTCMilliseconds()方法的使用详解
Jun 12 Javascript
jQuery插件jquery.kxbdmarquee.js实现无缝滚动效果
Feb 15 Javascript
jsonp跨域请求实现示例
Mar 13 Javascript
使用vue.js编写蓝色拼图小游戏
Mar 17 Javascript
JS图片轮播与索引变色功能实例详解
Jul 06 Javascript
node错误处理与日志记录的实现
Dec 24 Javascript
vue项目中在可编辑div光标位置插入内容的实现代码
Jan 07 Javascript
让IDE识别webpack的别名alias的实现方法
May 06 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数组排序函数合集 以及它们之间的联系分析
2013/06/27 PHP
删除html标签得到纯文本可处理嵌套的标签
2014/04/28 PHP
百度地图API应用之获取用户的具体位置
2014/06/10 PHP
PHP curl CURLOPT_RETURNTRANSFER参数的作用使用实例
2015/02/07 PHP
php curl抓取网页的介绍和推广及使用CURL抓取淘宝页面集成方法
2015/11/30 PHP
php反射类ReflectionClass用法分析
2016/05/12 PHP
CI(CodeIgniter)框架实现图片上传的方法
2017/03/24 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
Laravel框架基于ajax实现二级联动功能示例
2019/01/17 PHP
js trim函数 去空格函数与正则集锦
2009/11/20 Javascript
Jquery图形报表插件 jqplot简介及参数详解
2012/10/10 Javascript
重写javascript中window.confirm的行为
2012/10/21 Javascript
Javascript图像处理—亮度对比度应用案例
2013/01/03 Javascript
使用jQuery重置(reset)表单的方法
2014/05/05 Javascript
Javascript验证上传图片大小[前台处理]
2014/07/18 Javascript
jquery实现跳到底部,回到顶部效果的简单实例(类似锚)
2016/07/10 Javascript
JavaScript中获取时间的函数集
2016/08/16 Javascript
JS实现touch 点击滑动轮播实例代码
2017/01/19 Javascript
vue2里面ref的具体使用方法
2017/10/27 Javascript
JS数组进阶示例【数组的几种函数用法】
2020/01/16 Javascript
[01:02:25]2014 DOTA2华西杯精英邀请赛 5 24 iG VS DK
2014/05/26 DOTA
python爬虫基础教程:requests库(二)代码实例
2019/04/09 Python
python如何给字典的键对应的值为字典项的字典赋值
2019/07/05 Python
Python搭建代理IP池实现接口设置与整体调度
2019/10/27 Python
python实现AHP算法的方法实例(层次分析法)
2020/09/09 Python
python实现逻辑回归的示例
2020/10/09 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
2021/02/20 Python
HTML5 video循环播放多个视频的方法步骤
2020/08/06 HTML / CSS
拉丁舞学习者的自我评价
2013/10/27 职场文书
预备党员政审材料
2014/02/04 职场文书
反对四风自我剖析材料
2014/10/07 职场文书
机关党员三严三实心得体会
2014/10/13 职场文书
2015年安全生产月活动总结
2015/03/26 职场文书
军事理论课感想
2015/08/11 职场文书
西部计划志愿者工作总结
2015/08/11 职场文书
广告策划的实习心得体会总结!
2019/07/22 职场文书