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操作userdata
Apr 27 Javascript
JavaScript Sort 表格排序
Oct 31 Javascript
jQuery html()等方法介绍
Nov 18 Javascript
javascript parseInt与Number函数的区别
Jan 21 Javascript
jQuery EasyUI NumberBox(数字框)的用法
Jul 08 Javascript
ext中store.load跟store.reload的区别示例介绍
Jun 17 Javascript
Window.Open如何在同一个标签页打开
Jun 20 Javascript
JavaScript html5 canvas画布中删除一个块区域的方法
Jan 26 Javascript
最后说说Vue2 SSR 的 Cookies 问题
May 25 Javascript
JavaScript中构造函数与原型链之间的关系详解
Feb 25 Javascript
新手快速入门JavaScript装饰者模式与AOP
Jun 24 Javascript
解决vue单页面多个组件嵌套监听浏览器窗口变化问题
Jul 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
在php MYSQL中插入当前时间
2008/04/06 PHP
浅谈php和.net的区别
2014/09/28 PHP
php post json参数的传递和接收处理方法
2018/05/31 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
2020/02/06 PHP
使用Rancher在K8S上部署高性能PHP应用程序的教程
2020/07/10 PHP
基于jquery的横向滚动条(滑动条)
2011/02/24 Javascript
extjs ColumnChart设置不同的颜色实现代码
2013/05/17 Javascript
js substring从右边获取指定长度字符串(示例代码)
2013/12/23 Javascript
jQuery实现限制textarea文本框输入字符数量的方法
2015/05/28 Javascript
JSON字符串转换JSONObject和JSONArray的方法
2016/06/03 Javascript
javascript创建对象的3种方法
2016/11/02 Javascript
AngularJS中isolate scope的用法分析
2016/11/22 Javascript
bootstrap为水平排列的表单和内联表单设置可选的图标
2017/02/15 Javascript
Angular5.0 子组件通过service传递值给父组件的方法
2018/07/13 Javascript
nodejs实现获取本地文件夹下图片信息功能示例
2019/06/22 NodeJs
[01:02:25]2014 DOTA2华西杯精英邀请赛 5 24 iG VS DK
2014/05/26 DOTA
python实现给微信指定好友定时发送消息
2019/04/29 Python
Python中的类与类型示例详解
2019/07/10 Python
基于TensorBoard中graph模块图结构分析
2020/02/15 Python
Python内置异常类型全面汇总
2020/05/28 Python
Python第三方包PrettyTable安装及用法解析
2020/07/08 Python
python在地图上画比例的实例详解
2020/11/13 Python
Html5 canvas画图白板踩坑
2020/06/01 HTML / CSS
英国内衣连锁店:Boux Avenue
2018/01/24 全球购物
四川internet信息高速公路(C#)笔试题
2012/02/29 面试题
EJB面试题
2015/07/28 面试题
房屋改造计划书
2014/01/10 职场文书
省级青年文明号申报材料
2014/05/23 职场文书
乡镇精神文明建设汇报材料
2014/08/15 职场文书
2015年七一建党节演讲稿
2015/03/19 职场文书
村党总支部公开承诺书2016
2016/03/25 职场文书
传单、海报早OUT了,另类传单营销方案送给你!
2019/07/15 职场文书
Python开发之QT解决无边框界面拖动卡屏问题(附带源码)
2021/05/27 Python
聊一聊Redis与MySQL双写一致性如何保证
2021/06/26 Redis
MySQL 那些常见的错误设计规范,你都知道吗
2021/07/16 MySQL
Linux、ubuntu系统下查看显卡型号、显卡信息详解
2022/04/07 Servers