JavaScript对象的浅拷贝与深拷贝实例分析


Posted in Javascript onJuly 25, 2018

本文实例讲述了JavaScript对象的浅拷贝和深拷贝。分享给大家供大家参考,具体如下:

1、浅拷贝

仅仅复制对象的引用,而不是对象本身。

var person = {
  name: 'Alice',
  friends: ['Bruce', 'Cindy']
}
var student = {
  id: 30
}
student = simpleClone(person, student);
student.friends.push('David');
alert(person.friends);
function simpleClone(oldObj, newObj) {
  var newObj = newObj || {};
  for (var i in oldObj)
    newObj[i] = oldObj[i];
  return newObj;
}

使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun,测试运行结果:

JavaScript对象的浅拷贝与深拷贝实例分析

给子对象的数组类型的属性添加一个新值,父对象的该属性值也被篡改。

2、深拷贝

把复制的对象所引用的全部对象都复制一遍,能够实现真正意义上的数组和对象的拷贝。

浅拷贝的问题:如果父对象的属性值为一个数组或另一个对象,那么实际上子对象获得的只是一个内存地址,而不是对父对象的真正拷贝,因此存在父对象被篡改的可能。

解决方法:使用深拷贝。

var person = {
  name: 'Alice',
  friends: ['Bruce', 'Cindy']
}
var student = {
  id: 30
}
student = deepClone(person, student);
student.friends.push('David');
alert(person.friends); // 'Bruce', 'Cindy'
function deepClone(oldObj, newObj) {
  var newObj = newObj || {};
  newObj = JSON.parse(JSON.stringify(oldObj));
  return newObj;
}

使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun,测试运行结果:

JavaScript对象的浅拷贝与深拷贝实例分析

3、实现深拷贝的方法

1) 方法1:使用JSON.parse()方法

function deepClone(oldObj, newObj) {
  var newObj = newObj || {};
  newObj = JSON.parse(JSON.stringify(oldObj));
  return newObj;
}

优点:

简单易用。

缺点:

① 会抛弃对象的constructor,即,深拷贝后,不管该对象原来的构造函数是什么,在深拷贝之后都会变成Object。

② 能正确处理的对象只有 Number, String, Boolean, Array,即那些能够被JSON直接表示的数据结构,RegExp对象等无法通过这种方式深拷贝。

2) 方法2:递归拷贝

function deepClone(oldObj, newObj) {
  var newObj = newObj || {};
  for (var i in oldObj) {
    if (typeof oldObj[i] === 'object') {
      newObj[i] = (oldObj[i].constructor === Array) ? [] : {};
      arguments.callee(oldObj[i], newObj[i]);
    }
    else
      newObj[i] = oldObj[i];
  }
  return newObj;
}

问题:当遇到两个互相引用的对象,会出现死循环的情况。

解决方法:在遍历时判断两个对象是否相互引用(如oldObj.property === newObj),如果是则退出循环。

function deepClone(oldObj, newObj) {
  var newObj = newObj || {};
  for (var i in oldObj) {
    var prop = oldObj[i];
    if (prop === newObj)
          continue;
    if (typeof prop === 'object') {
      newObj[i] = (prop.constructor === Array) ? [] : {};
      arguments.callee(prop, newObj[i]);
    }
    else
      newObj[i] = prop;
  }
  return newObj;
}

3) 方法3:使用Object.create()方法

function deepClone(oldObj, newObj) {
  var newObj = newObj || {};
  for (var i in oldObj) {
    var prop = oldObj[i];
    if (prop === newObj)
          continue;
    if (typeof prop === 'object')
      newObj[i] = (prop.constructor === Array) ? [] : Object.create(prop);
    else
      newObj[i] = prop;
  }
  return newObj;
}

4)方法4:使用jQuery.extend()jQuery.fn.extend()

请见:https://3water.com/article/144424.htm

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript获取select的当前值示例代码(兼容IE/Firefox/Opera/Chrome)
Dec 17 Javascript
jQuery(js)获取文字宽度(显示长度)示例代码
Dec 31 Javascript
jQuery移除元素自动解绑事件实现思路及代码
May 31 Javascript
浅析Node.js中的内存泄漏问题
Jun 23 Javascript
jquery性能优化高级技巧
Aug 24 Javascript
纯JS实现简单的日历
Jun 26 Javascript
JavaScript Date对象应用实例分享
Oct 30 Javascript
VUE 组件转换为微信小程序组件的方法
Nov 06 Javascript
微信内置开发 iOS修改键盘换行为搜索的解决方案
Nov 06 Javascript
node使用mysql获取数据库数据中文乱码问题的解决
Dec 02 Javascript
JS面向对象编程基础篇(二) 封装操作实例详解
Mar 03 Javascript
vue实现数字滚动效果
Jun 29 Javascript
Vue与Node.js通过socket.io通信的示例代码
Jul 25 #Javascript
jQuery.extend 与 jQuery.fn.extend的用法及区别实例分析
Jul 25 #jQuery
详解Vue源码学习之callHook钩子函数
Jul 25 #Javascript
详解操作虚拟dom模拟react视图渲染
Jul 25 #Javascript
浅析JS中回调函数及用法
Jul 25 #Javascript
详解使用mpvue开发github小程序总结
Jul 25 #Javascript
详解mpvue开发小程序小总结
Jul 25 #Javascript
You might like
php 操作excel文件的方法小结
2009/12/31 PHP
php正则匹配html中带class的div并选取其中内容的方法
2015/01/13 PHP
PHP的Yii框架中Model模型的学习教程
2016/03/29 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
2017/11/17 PHP
PDO::query讲解
2019/01/29 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
网页开发中的容易忽略的问题 javascript HTML中的table
2009/04/15 Javascript
Javascript学习笔记4 Eval函数
2010/01/11 Javascript
javascript 不间断的图片滚动并可点击
2010/01/15 Javascript
分享XmlHttpRequest调用Webservice的一点心得
2012/07/20 Javascript
为指定的元素添加遮罩层的示例代码
2014/01/15 Javascript
jquery比较简洁的软键盘特效实现方法
2015/03/19 Javascript
javascript每日必学之运算符
2016/02/16 Javascript
js实现手机发送验证码功能
2017/03/13 Javascript
基于JQuery和原生JavaScript实现网页定位导航特效
2017/04/03 jQuery
Node.js+ES6+dropload.js实现移动端下拉加载实例
2017/06/01 Javascript
vue使用stompjs实现mqtt消息推送通知
2017/06/22 Javascript
浅谈angular4实际项目搭建总结
2017/12/01 Javascript
详解Angular2学习笔记之Html属性绑定
2018/01/03 Javascript
vue form 表单提交后刷新页面的方法
2018/09/04 Javascript
详解JavaScript 的变量
2019/03/08 Javascript
原生javascript中this几种常见用法总结
2020/02/24 Javascript
深入了解Vue.js 混入(mixins)
2020/07/23 Javascript
[00:12]DAC SOLO赛卫冕冠军 VG.Paparazi灬展现SOLO技巧
2018/04/06 DOTA
python对数组进行反转的方法
2015/05/20 Python
python 循环遍历字典元素的简单方法
2016/09/11 Python
python try except返回异常的信息字符串代码实例
2019/08/15 Python
Python3 main函数使用sys.argv传入多个参数的实现
2019/12/25 Python
使用python turtle画高达
2020/01/19 Python
使用css3实现的windows8开机加载动画
2014/12/09 HTML / CSS
人事档案接收函
2014/01/12 职场文书
上班打牌检讨书
2014/02/07 职场文书
校园公益广告语
2014/03/13 职场文书
文体活动总结范文
2014/05/05 职场文书
新郎结婚感言
2015/07/31 职场文书
这样写python注释让代码更加的优雅
2021/06/02 Python