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 相关文章推荐
Js放到HTML文件中的哪个位置有什么区别
Aug 21 Javascript
js全屏显示显示代码的三种方法
Nov 11 Javascript
JavaScript怎么判断图片是否加载完成以便获取其尺寸
May 08 Javascript
一个支持任意尺寸的图片上下左右滑动效果
Aug 24 Javascript
JavaScript数组去重的3种方法和代码实例
Jul 01 Javascript
Bootstrap按钮组简单实现代码
Mar 06 Javascript
js利用递归与promise 按顺序请求数据的方法
Aug 30 Javascript
微信小程序如何获取地址
Dec 24 Javascript
javascript Canvas动态粒子连线
Jan 01 Javascript
详解elementUI中input框无法输入的问题
Apr 27 Javascript
原生js+canvas实现下雪效果
Aug 02 Javascript
详解vue组件之间的通信
Aug 30 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
thinkPHP简单实现多个子查询语句的方法
2016/12/05 PHP
PHP后期静态绑定之self::限制实例分析
2018/12/21 PHP
PHP simplexml_load_string()函数实例讲解
2019/02/03 PHP
JavaScript面向对象编程
2008/03/02 Javascript
javascript 获取select下拉列表值的代码
2009/09/07 Javascript
jquery text()要注意啦
2009/10/30 Javascript
JavaScript 对象链式操作测试代码
2010/04/25 Javascript
使用ExtJS技术实现的拖动树结点
2010/08/05 Javascript
JQuery页面图片切换和新闻列表滚动效果的具体实现
2013/09/26 Javascript
JavaScript中innerHTML,innerText,outerHTML的用法及区别
2015/09/01 Javascript
基于jQuery实现拖拽图标到回收站并删除功能
2015/11/25 Javascript
基于jQuery实现滚动刷新效果
2017/01/09 Javascript
简单实现js倒计时功能
2017/02/13 Javascript
js实现登录框鼠标拖拽效果
2017/03/09 Javascript
JS检测数组类型的方法小结
2017/03/14 Javascript
Angular4学习笔记之新建项目的方法
2017/07/18 Javascript
使用JS中的Replace()方法遇到的问题小结
2017/10/20 Javascript
vue初尝试--项目结构(推荐)
2018/01/30 Javascript
vue 监听屏幕高度的实例
2018/09/05 Javascript
jquery 插件重新绑定的处理方法分析
2019/11/23 jQuery
在vue中实现禁止屏幕滚动,禁止屏幕滑动
2020/07/22 Javascript
解决antd 表单设置默认值initialValue后验证失效的问题
2020/11/02 Javascript
python中安装Scrapy模块依赖包汇总
2017/07/02 Python
对python函数签名的方法详解
2019/01/22 Python
根据tensor的名字获取变量的值方式
2020/01/04 Python
Django实现从数据库中获取到的数据转换为dict
2020/03/27 Python
通过实例解析python subprocess模块原理及用法
2020/10/10 Python
Python类的继承super相关原理解析
2020/10/22 Python
python 利用opencv实现图像网络传输
2020/11/12 Python
CSS3绘制六边形的简单实现
2016/08/25 HTML / CSS
Dr.Jart+美国官网:韩国药妆品牌
2019/01/18 全球购物
公交公司毕业生求职信
2014/02/15 职场文书
初中同学会活动方案
2014/08/22 职场文书
离退休人员聘用协议书
2014/11/24 职场文书
先进工作者事迹材料
2014/12/23 职场文书
2015年大学班长个人工作总结
2015/04/24 职场文书