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 相关文章推荐
javascript高亮效果的二种实现方法
Sep 14 Javascript
jQuery 树形结构的选择器
Feb 15 Javascript
解析JavaScript中delete操作符不能删除的对象
Dec 03 Javascript
js/jquery判断浏览器类型的方法小结
May 12 Javascript
简介JavaScript中的setTime()方法的使用
Jun 11 Javascript
jQuery移动web开发之页面跳转和加载外部页面的实现
Dec 04 Javascript
angularjs 表单密码验证自定义指令实现代码
Oct 27 Javascript
Node.js常用工具之util模块
Mar 09 Javascript
jQuery模拟窗口抖动效果
Mar 15 Javascript
JS手机端touch事件计算滑动距离的方法示例
Oct 26 Javascript
vue element-ui el-date-picker限制选择时间为当天之前的代码
Nov 07 Javascript
js实现倒计时秒杀效果
Mar 25 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与javascript对多项选择的处理
2006/10/09 PHP
PHP安装攻略:常见问题解答(二)
2006/10/09 PHP
Ubuntu 16.04中Laravel5.4升级到5.6的步骤
2018/12/07 PHP
PHP autoload使用方法及步骤详解
2020/09/05 PHP
js函数模拟显示桌面.scf程序示例
2014/04/20 Javascript
jQuery获取动态生成的元素示例
2014/06/15 Javascript
node.js require() 源码解读
2015/12/13 Javascript
jQuery实现的多张图无缝滚动效果【测试可用】
2016/09/12 Javascript
webpack配置文件和常用配置项介绍
2017/04/28 Javascript
Flask中获取小程序Request数据的两种方法
2017/05/12 Javascript
javascript实现Java中的Map对象功能的实例详解
2017/08/21 Javascript
requireJS模块化实现返回顶部功能的方法详解
2017/10/16 Javascript
利用js将ajax获取到的后台数据动态加载至网页中的方法
2018/08/08 Javascript
微信小程序跨页面传递data数据方法解析
2019/12/13 Javascript
JS面向对象编程实现的Tab选项卡案例详解
2020/03/03 Javascript
[02:00]DOTA2英雄COSPLAY闹市街头巡游助威2015国际邀请赛
2015/08/02 DOTA
[37:21]完美世界DOTA2联赛PWL S2 Inki vs Magma 第二场 11.22
2020/11/24 DOTA
python中global与nonlocal比较
2014/11/21 Python
Python3处理文件中每个词的方法
2015/05/22 Python
pytorch + visdom 处理简单分类问题的示例
2018/06/04 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
2019/04/09 Python
pytorch中使用cuda扩展的实现示例
2020/02/12 Python
python 读取二进制 显示图片案例
2020/04/24 Python
Python3 pywin32模块安装的详细步骤
2020/05/26 Python
在Pytorch中使用Mask R-CNN进行实例分割操作
2020/06/24 Python
css3 盒模型以及box-sizing属性全面了解
2016/09/20 HTML / CSS
NULL是什么,它是怎么定义的
2015/05/09 面试题
灵泰克Java笔试题
2016/01/09 面试题
护理专业的自荐信
2013/10/22 职场文书
《路旁的橡树》教学反思
2014/04/07 职场文书
党建工作经验交流材料
2014/05/25 职场文书
物资采购方案
2014/06/12 职场文书
2014年计生标语
2014/06/23 职场文书
小班上学期幼儿评语
2014/12/30 职场文书
我们的节日元宵节活动总结
2015/02/06 职场文书
鸡毛信观后感
2015/06/11 职场文书