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 相关文章推荐
window.location不跳转的问题解决方法
Apr 17 Javascript
JavaScript中for循环的使用详解
Jun 03 Javascript
动态加载js、css的简单实现代码
May 26 Javascript
JavaScript中的各种操作符使用总结
May 26 Javascript
Java框架SSH结合Easyui控件实现省市县三级联动示例解析
Jun 12 Javascript
Javascript中常用类型的格式化方法小结
Dec 26 Javascript
jQuery ajax调用webservice注意事项
Oct 08 jQuery
初探js和简单隐藏效果的实例
Nov 23 Javascript
基于javascript 显式转换与隐式转换(详解)
Dec 15 Javascript
Vue 全局loading组件实例详解
May 29 Javascript
推荐一个基于Node.js的表单验证库
Feb 15 Javascript
使用element-ui table expand展开行实现手风琴效果
Mar 15 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
thinkphp3.0 模板中函数的使用
2012/11/13 PHP
ThinkPHP3.1基础知识快速入门
2014/06/19 PHP
PHP判断浏览器、判断语言代码分享
2015/03/05 PHP
js动态添加onload、onresize、onscroll事件(另类方法)
2012/12/26 Javascript
js获取class的所有元素
2013/03/28 Javascript
浅谈页面装载js及性能分析方法
2014/12/09 Javascript
js与css实现弹出层覆盖整个页面的方法
2014/12/13 Javascript
有效提高JavaScript执行效率的几点知识
2015/01/31 Javascript
基于js实现的限制文本框只可以输入数字
2016/12/05 Javascript
es6的数字处理的方法(5个)
2017/03/16 Javascript
详解基于Bootstrap+angular的一个豆瓣电影app
2017/06/26 Javascript
vue实现底部菜单功能
2018/07/24 Javascript
Angular使用cli生成自定义文件、组件的方法
2018/09/04 Javascript
vue 属性拦截实现双向绑定的实例代码
2018/10/24 Javascript
详解如何在Node.js的httpServer中接收前端发送的arraybuffer数据
2018/11/11 Javascript
基于JS实现操作成功之后自动跳转页面
2020/09/25 Javascript
Python采用socket模拟TCP通讯的实现方法
2014/11/19 Python
Python 如何访问外围作用域中的变量
2016/09/11 Python
python对json的相关操作实例详解
2017/01/04 Python
利用Anaconda完美解决Python 2与python 3的共存问题
2017/05/25 Python
python变量的存储原理详解
2019/07/10 Python
python pygame实现挡板弹球游戏
2019/11/25 Python
pandas实现excel中的数据透视表和Vlookup函数功能代码
2020/02/14 Python
python实现将列表中各个值快速赋值给多个变量
2020/04/02 Python
Python 实现打印单词的菱形字符图案
2020/04/12 Python
Python+OpenCV检测灯光亮点的实现方法
2020/11/02 Python
用HTML5实现手机摇一摇的功能的教程
2012/10/30 HTML / CSS
在线服装零售商:SheIn
2016/07/22 全球购物
联想中国官方商城:Lenovo China
2017/10/18 全球购物
大学生的网上创业计划书
2013/12/31 职场文书
文明礼仪标语
2014/06/13 职场文书
医院合作意向书范本
2015/05/08 职场文书
关于空气污染危害的感想
2015/08/11 职场文书
canvas多重阴影发光效果实现
2021/04/20 Javascript
python中如何对多变量连续赋值
2021/06/03 Python
基于PyQt5制作一个群发邮件工具
2022/04/08 Python