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随机排序(随即出牌)
Sep 17 Javascript
JavaScript的递归之递归与循环示例介绍
Aug 05 Javascript
JS动态调用方法名示例介绍
Dec 18 Javascript
jQuery实现table隔行换色和鼠标经过变色的两种方法
Jun 15 Javascript
jQuery级联操作绑定事件实例
Sep 02 Javascript
AngularJS基础知识
Dec 21 Javascript
JS给超链接加确认对话框的方法
Feb 24 Javascript
javascript表格隔行变色加鼠标移入移出及点击效果的方法
Apr 10 Javascript
js实现抽奖效果
Mar 27 Javascript
React + webpack 环境配置的方法步骤
Sep 07 Javascript
koa socket即时通讯的示例代码
Sep 07 Javascript
Vue 封装防刷新考试倒计时组件的实现
Jun 05 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
PHP4实际应用经验篇(7)
2006/10/09 PHP
PHP 中执行排序与 MySQL 中排序
2009/04/21 PHP
基于PHP的cURL快速入门教程 (小偷采集程序)
2011/06/02 PHP
ThinkPHP3.2.2的插件控制器功能
2015/03/05 PHP
PHP大文件分片上传的实现方法
2018/10/28 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
js中判断Object、Array、Function等引用类型对象是否相等
2012/08/29 Javascript
js 有框架页面跳转(target)三种情况下的应用
2013/04/09 Javascript
javaScript函数中执行C#代码中的函数方法总结
2013/08/07 Javascript
js 实现浏览历史记录示例
2014/04/20 Javascript
jQuery使用after()方法在元素后面添加多项内容的方法
2015/03/26 Javascript
jQuery插件实现无缝滚动特效
2015/11/24 Javascript
详解Javascript模板引擎mustache.js
2016/01/20 Javascript
JS中artdialog弹出框控件之提交表单思路详解
2016/04/18 Javascript
JS图片压缩(pc端和移动端都适用)
2017/01/12 Javascript
jQuery Masonry瀑布流插件使用方法详解
2017/01/18 Javascript
EasyUI中的dataGrid的行内编辑
2017/06/22 Javascript
使用JavaScript开发跨平台的桌面应用详解
2017/07/27 Javascript
js删除数组中的元素delete和splice的区别详解
2018/02/03 Javascript
JavaScript插入排序算法原理与实现方法示例
2018/08/06 Javascript
vue3.0自定义指令(drectives)知识点总结
2020/12/27 Vue.js
[52:44]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第一场 6.3
2018/06/04 DOTA
Python 深入理解yield
2008/09/06 Python
python 动态加载的实现方法
2017/12/22 Python
python3中的md5加密实例
2018/05/29 Python
Python获取好友地区分布及好友性别分布情况代码详解
2019/07/10 Python
Python自动化测试笔试面试题精选
2020/03/12 Python
html5 canvas的绘制文本自动换行的示例代码
2018/09/17 HTML / CSS
赔偿协议书
2015/01/27 职场文书
材料采购员岗位职责
2015/04/03 职场文书
2015年高中班主任工作总结
2015/04/30 职场文书
卫生院义诊活动总结
2015/05/07 职场文书
2015年度学校卫生工作总结
2015/05/12 职场文书
祝寿主持词
2015/07/02 职场文书
婚礼答谢词范文
2015/09/29 职场文书
创业计划书之少年玩具店
2019/09/05 职场文书