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 相关文章推荐
JS 面向对象之神奇的prototype
Feb 26 Javascript
jQuery 阴影插件代码分享
Jan 09 Javascript
jQuery实现下滑菜单导航效果代码
Aug 25 Javascript
jquery实现超简洁的TAB选项卡效果代码
Aug 28 Javascript
jQuery获取浏览器类型和版本号的方法
Jul 05 Javascript
Vue中的混入的使用(vue mixins)
Jun 01 Javascript
webpack打包多页面的方法
Nov 30 Javascript
jQuery实现的卷帘门滑入滑出效果【案例】
Feb 18 jQuery
Vue CLI3创建项目部署到Tomcat 使用ngrok映射到外网
May 16 Javascript
浅谈vue限制文本框输入数字的正确姿势
Sep 02 Javascript
关于element-ui表单中限制输入纯数字的解决方式
Sep 08 Javascript
vue如何使用模拟的json数据查看效果
Mar 31 Vue.js
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 @ at 记号的作用示例介绍
2014/10/10 PHP
CI框架数据库查询之join用法分析
2016/05/18 PHP
PHP实现对二维数组某个键排序的方法
2016/09/14 PHP
详解PHP实现支付宝小程序用户授权的工具类
2018/12/25 PHP
精解window.setTimeout()&window.setInterval()使用方式与参数传递问题!
2007/11/23 Javascript
JavaScript Cookie 直接浏览网站分网址
2009/12/08 Javascript
原生javascript实现隔行换色
2015/01/04 Javascript
js实现图片无缝滚动特效
2020/03/19 Javascript
jquery插件方式实现table查询功能的简单实例
2016/06/06 Javascript
jQuery自适应轮播图插件Swiper用法示例
2016/08/24 Javascript
基于Vuejs框架实现翻页组件
2020/06/29 Javascript
浅谈JavaScript的闭包函数
2016/12/08 Javascript
vue.js利用Object.defineProperty实现双向绑定
2017/03/09 Javascript
Vue项目webpack打包部署到Tomcat刷新报404错误问题的解决方案
2018/05/15 Javascript
JavaScript中为事件指定处理程序的五种方式分析
2018/07/27 Javascript
javascript实现函数柯里化与反柯里化过程解析
2019/10/08 Javascript
vue实现计步器功能
2019/11/01 Javascript
vue v-for直接循环数字实例
2019/11/07 Javascript
jquery传参及获取方式(两种方式)
2020/02/13 jQuery
Vue看了就会的8个小技巧
2021/01/21 Vue.js
[02:37]2018DOTA2亚洲邀请赛赛前采访-EG篇
2018/04/03 DOTA
Python3读取文件常用方法实例分析
2015/05/22 Python
Python基于PycURL自动处理cookie的方法
2015/07/25 Python
Python基于回溯法解决01背包问题实例
2017/12/06 Python
Tensorflow 同时载入多个模型的实例讲解
2018/07/27 Python
程序员写Python时的5个坏习惯,你有几条?
2018/11/26 Python
解决tensorflow/keras时出现数组维度不匹配问题
2020/06/29 Python
Python基于xlrd模块处理合并单元格
2020/07/28 Python
自动一体化专业求职信
2014/03/15 职场文书
员工趣味活动方案
2014/08/27 职场文书
金融保险专业求职信
2014/09/03 职场文书
合伙购房协议样本
2014/10/06 职场文书
2014年绿化工作总结
2014/12/09 职场文书
教师创先争优承诺书
2015/04/27 职场文书
《活见鬼》教学反思
2016/02/24 职场文书
责任书格式
2019/04/18 职场文书