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文件 document.createElement
Oct 14 Javascript
原生js实现shift/ctrl/alt按键的获取
Apr 08 Javascript
jQuery选择器源码解读(七):elementMatcher函数
Mar 31 Javascript
JavaScript实现鼠标滑过处生成气泡的方法
May 16 Javascript
js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)
Jul 18 Javascript
简单谈谈vue的过渡动画(推荐)
Oct 11 Javascript
详解vue-cli 本地开发mock数据使用方法
May 29 Javascript
微信小程序动画组件使用解析,类似vue,且更强大
Aug 01 Javascript
vue中的mescroll搜索运用及各种填坑处理
Oct 30 Javascript
vue项目前端微信JSAPI与外部H5支付相关实现过程及常见问题
Apr 14 Javascript
微信小程序 scroll-view的使用案例代码详解
Jun 11 Javascript
TypeScript实用技巧 Nominal Typing名义类型详解
Sep 23 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
松下Panasonic RF-B65电路分析
2021/03/02 无线电
通俗易懂的php防注入代码
2010/04/07 PHP
mac下使用brew配置环境的步骤分享
2011/05/23 PHP
PHP 使用header函数设置HTTP头的示例解析 表头
2013/06/17 PHP
PHP实现将视频转成MP4并获取视频预览图的方法
2015/03/12 PHP
PHP使用socket发送HTTP请求的方法
2016/02/14 PHP
PHP-X系列教程之内置函数的使用示例
2017/10/16 PHP
javascript this用法小结
2008/12/19 Javascript
bgsound 背景音乐 的一些常用方法及特殊用法小结
2010/05/11 Javascript
从面试题学习Javascript 面向对象(创建对象)
2012/03/30 Javascript
jQuery使用andSelf()来包含之前的选择集
2014/05/19 Javascript
JavaScript中的null和undefined区别介绍
2015/01/01 Javascript
javascript仿京东导航左侧分类导航下拉菜单效果
2020/11/25 Javascript
基于jQuery实现多标签页切换的效果(web前端开发)
2016/07/24 Javascript
javascript实现无法关闭的弹框
2016/11/27 Javascript
使用jsonp实现跨域获取数据实例讲解
2016/12/25 Javascript
基于JavaScript实现带缩略图的轮播效果
2017/01/12 Javascript
Angular.js实现获取验证码倒计时60秒按钮的简单方法
2017/10/18 Javascript
微信小程序解除10个请求并发限制
2018/12/18 Javascript
jQuery对底部导航进行跳转并高亮显示的实例代码
2019/04/23 jQuery
JavaScript解析JSON数据示例
2019/07/16 Javascript
微信小程序实现侧边分类栏
2019/10/21 Javascript
小程序跳转H5页面的方法步骤
2020/03/06 Javascript
[01:00:12]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第一场
2018/04/09 DOTA
python发布模块的步骤分享
2014/02/21 Python
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
2015/11/07 Python
Python 模板引擎的注入问题分析
2017/01/01 Python
Python变量和字符串详解
2017/04/29 Python
NumPy 基本切片和索引的具体使用方法
2019/04/24 Python
python画图把时间作为横坐标的方法
2019/07/07 Python
python3实现用turtle模块画一棵随机樱花树
2019/11/21 Python
python队列原理及实现方法示例
2019/11/27 Python
自考生自我鉴定范文
2013/10/01 职场文书
大学专科自荐信
2014/06/17 职场文书
幼儿教师远程研修感悟
2015/11/18 职场文书
2019西餐厅创业计划书范文!
2019/07/12 职场文书