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定义类或函数的几种方式小结
Jan 09 Javascript
javascript (用setTimeout而非setInterval)
Dec 28 Javascript
一个关于javascript匿名函数的问题分析
Mar 30 Javascript
js+css实现的简单易用兼容好的分页
Dec 30 Javascript
javascript实现带下拉子菜单的导航菜单效果
May 14 Javascript
javascript深拷贝(deepClone)详解
Aug 24 Javascript
js对象浅拷贝和深拷贝详解
Sep 05 Javascript
BootStrap下拉菜单和滚动监听插件实现代码
Sep 26 Javascript
老生常谈jquery id选择器和class选择器的区别
Feb 12 Javascript
vue中前进刷新、后退缓存用户浏览数据和浏览位置的实例讲解
Sep 21 Javascript
Vue表单控件绑定图文详解
Feb 11 Javascript
使用layui+ajax实现简单的菜单权限管理及排序的方法
Sep 10 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转盘抽奖接口实例
2015/02/09 PHP
laravel框架中间件简单使用方法示例
2020/01/25 PHP
PHP执行linux命令6个函数代码实例
2020/11/24 PHP
javascript AOP 实现ajax回调函数使用比较方便
2010/11/20 Javascript
js中scrollHeight,scrollWidth,scrollLeft,scrolltop等差别介绍
2012/05/16 Javascript
jquery 无限级联菜单案例分享
2013/03/26 Javascript
如何让DIV可编辑、可拖动示例代码
2013/09/18 Javascript
javascript中的throttle和debounce浅析
2014/06/06 Javascript
JS封装cookie操作函数实例(设置、读取、删除)
2015/11/17 Javascript
基于jQuery实现放大镜特效
2020/10/19 Javascript
解析JavaScript面向对象概念中的Object类型与作用域
2016/05/10 Javascript
Javascript类型系统之undefined和null浅析
2016/07/13 Javascript
javascript中数组和字符串的方法对比
2016/07/20 Javascript
react+redux的升级版todoList的实现
2017/12/18 Javascript
JS 实现分页打印功能
2018/05/16 Javascript
vue自定义键盘信息、监听数据变化的方法示例【基于vm.$watch】
2019/03/16 Javascript
基于Node.js搭建hexo博客过程详解
2019/06/25 Javascript
[47:04]EG vs RNG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
利用Python的Django框架生成PDF文件的教程
2015/07/22 Python
Python 2与Python 3版本和编码的对比
2017/02/14 Python
Python中出现IndentationError:unindent does not match any outer indentation level错误的解决方法
2020/04/18 Python
python爬虫刷访问量 2019 7月
2019/08/01 Python
django项目简单调取百度翻译接口的方法
2019/08/06 Python
Python环境Pillow( PIL )图像处理工具使用解析
2019/09/12 Python
PyCharm常用配置和常用插件(小结)
2021/02/06 Python
JackJones官方旗舰店:杰克琼斯男装
2018/03/27 全球购物
美国最大的在线生存商店:Survival Frog
2020/12/13 全球购物
求职信的要素有哪些呢
2013/12/26 职场文书
信息专业个人的自我评价
2013/12/27 职场文书
中文师范生自荐信
2014/01/30 职场文书
学生党支部先进事迹
2014/02/04 职场文书
运动会邀请函范文
2014/02/06 职场文书
教师四风自我剖析材料
2014/09/30 职场文书
工作骂脏话检讨书
2014/10/05 职场文书
MySQL 聚合函数排序
2021/07/16 MySQL
SQL Server使用T-SQL语句批处理
2022/05/20 SQL Server