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 相关文章推荐
document.body.scrollTop 值总为0的解决方法 比较常见的标准问题
Nov 30 Javascript
js ondocumentready onmouseover onclick onmouseout 样式
Jul 22 Javascript
javascript 二进制运算技巧解析
Nov 27 Javascript
jQuery 获取和设置select下拉框的值实现代码
Nov 08 Javascript
微信中一些常用的js方法汇总
Mar 12 Javascript
JavaScript字符串常用类使用方法汇总
Apr 14 Javascript
JQuery实现的按钮倒计时效果
Dec 23 Javascript
微信小程序购物商城系统开发系列-目录结构介绍
Nov 21 Javascript
原生js二级联动效果
Jun 20 Javascript
JavaScript在web自动化测试中的作用示例详解
Aug 25 Javascript
100行代码实现vue表单校验功能(小白自编)
Nov 19 Javascript
Vue实现todo应用的示例
Feb 20 Vue.js
微信小程序搜索功能(附:小程序前端+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 执行系统命令的方法
2009/07/07 PHP
php+mysqli实现批量替换数据库表前缀的方法
2014/12/29 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
PHP中quotemeta()函数的用法讲解
2019/04/04 PHP
PHP实现创建一个RPC服务操作示例
2020/02/23 PHP
javascript实现焦点滚动图效果 具体方法
2013/06/24 Javascript
TypeScript 中接口详解
2015/06/19 Javascript
JS使用单链表统计英语单词出现次数
2016/06/16 Javascript
Vue表单验证插件Vue Validator使用方法详解
2017/04/07 Javascript
JavaScript实现移动端轮播效果
2017/06/06 Javascript
详解angularjs的数组传参方式的简单实现
2017/07/28 Javascript
JavaScript深拷贝和浅拷贝概念与用法实例分析
2018/06/07 Javascript
js实现随机div颜色位置 类似满天星效果
2019/10/24 Javascript
vue 父组件通过v-model接收子组件的值的代码
2019/10/27 Javascript
解决三元运算符 报错“SyntaxError: can''t assign to conditional expression”
2020/02/12 Javascript
[02:05]2014DOTA2西雅图邀请赛 专访啸天mik夫妻档
2014/07/08 DOTA
Python 正则表达式操作指南
2009/05/04 Python
python利用beautifulSoup实现爬虫
2014/09/29 Python
各个系统下的Python解释器相关安装方法
2015/10/12 Python
python 实现登录网页的操作方法
2018/05/11 Python
python实现雪花飘落效果实例讲解
2019/06/18 Python
python函数与方法的区别总结
2019/06/23 Python
Python获取好友地区分布及好友性别分布情况代码详解
2019/07/10 Python
python使用原始套接字发送二层包(链路层帧)的方法
2019/07/22 Python
Python 余弦相似度与皮尔逊相关系数 计算实例
2019/12/23 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
2020/04/24 Python
python小白学习包管理器pip安装
2020/06/09 Python
详解canvas在圆弧周围绘制文本的两种写法
2018/05/22 HTML / CSS
斯凯奇美国官网:SKECHERS美国
2016/08/20 全球购物
医疗保健专业人士购物网站:Scrubs & Beyond
2017/02/08 全球购物
业务部门经理岗位职责
2014/02/23 职场文书
党员个人公开承诺书
2014/08/29 职场文书
2014党的群众路线教育实践活动总结材料
2014/10/31 职场文书
pandas中DataFrame数据合并连接(merge、join、concat)
2021/05/30 Python
spring IOC容器的Bean管理XML自动装配过程
2022/05/30 Java/Android