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 给汉字排序实例代码
Jun 28 Javascript
在JavaScript中,为什么要尽可能使用局部变量?
Apr 06 Javascript
innerText和textContent对比及使用介绍
Feb 27 Javascript
jquery使用slideDown实现模块缓慢拉出效果的方法
Mar 27 Javascript
JS组件Bootstrap实现弹出框效果代码
Apr 26 Javascript
浅谈JavaScript for循环 闭包
Jun 22 Javascript
webpack+vue2构建vue项目骨架的方法
Jan 09 Javascript
JS使用正则表达式获取小括号、中括号及花括号内容的方法示例
Jun 01 Javascript
Node.js中的不安全跳转如何防御详解
Oct 21 Javascript
JS闭包原理与应用经典示例
Dec 20 Javascript
Vue.js+cube-ui(Scroll组件)实现类似头条效果的横向滚动导航条
Jun 24 Javascript
详解vue-router的导航钩子(导航守卫)
Nov 02 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版(5)
2006/10/09 PHP
php ckeditor上传图片文件名乱码解决方法
2013/11/15 PHP
解密ThinkPHP3.1.2版本之模块和操作映射
2014/06/19 PHP
PHP结合Jquery和ajax实现瀑布流特效
2016/01/07 PHP
jquery 模拟类搜索框自动完成搜索提示功能(改进)
2010/05/24 Javascript
一个报数游戏js版(约瑟夫环问题)
2010/08/05 Javascript
读jQuery之十一 添加事件核心方法
2011/07/31 Javascript
jQuery判断div随滚动条滚动到一定位置后停止
2014/04/02 Javascript
ExtJS4 表格的嵌套 rowExpander应用
2014/05/02 Javascript
JavaScript中的this,call,apply使用及区别详解
2016/01/29 Javascript
jQuery插件ImageDrawer.js实现动态绘制图片动画(附源码下载)
2016/02/25 Javascript
jquery动态切换背景图片的简单实现方法
2016/05/14 Javascript
jQuery 全选 全不选 事件绑定的实现代码
2017/01/23 Javascript
JS中的BOM应用
2018/02/02 Javascript
vue项目使用axios发送请求让ajax请求头部携带cookie的方法
2018/09/26 Javascript
JQuery模拟实现网页中自定义鼠标右键菜单功能
2018/11/14 jQuery
JavaScript判断数组类型的方法
2019/10/23 Javascript
iSlider手机端图片滑动切换插件使用详解
2019/12/24 Javascript
Python3 能振兴 Python的原因分析
2014/11/28 Python
介绍Python的Django框架中的静态资源管理器django-pipeline
2015/04/25 Python
Python 功能和特点(新手必学)
2015/12/30 Python
python的re正则表达式实例代码
2018/01/24 Python
python3.4.3下逐行读入txt文本并去重的方法
2018/04/29 Python
Python列表生成式与生成器操作示例
2018/08/01 Python
Python的UTC时间转换讲解
2019/02/26 Python
Python3从零开始搭建一个语音对话机器人的实现
2019/08/23 Python
pycharm显示远程图片的实现
2019/11/04 Python
Python 将 QQ 好友头像生成祝福语的实现代码
2020/05/03 Python
Django admin管理工具TabularInline类用法详解
2020/05/14 Python
成人高等教育毕业生自我鉴定
2013/10/22 职场文书
大学生自我鉴定范文
2013/12/28 职场文书
春节联欢晚会主持词范文
2014/03/24 职场文书
房屋出租协议书
2014/04/10 职场文书
网络营销计划书
2015/01/17 职场文书
CSS3 制作的彩虹按钮样式
2021/04/11 HTML / CSS
Python时间操作之pytz模块使用详解
2022/06/14 Python