js实现数组和对象的深浅拷贝

yizhihongxing

JS 实现数组和对象的深浅拷贝可以使用不同的方法,下面是几种实现方式及其对应的代码示例。

浅拷贝

浅拷贝只是针对对象和数组的一层拷贝,除了基本类型以外,只是复制了一份引用地址。原始数据和拷贝数据共享同一片内存,也就是说,对其中一个进行修改,就会影响到另外一个。实现浅拷贝的方法主要有 Object.assign() 和 Array.prototype.concat()。

方法一:Object.assign()

Object.assign() 可以把一个或多个源对象的所有可枚举属性复制到一个目标对象中。它的用法是 Object.assign(target, ...source),其中 target 是目标对象,source 是一个或多个源对象。

语法示例:

let obj1 = { a: 1 };
let obj2 = { b: 2 };
let obj = Object.assign({}, obj1, obj2);
console.log(obj); // { a: 1, b: 2 }

方法二:Array.prototype.concat()

Array.prototype.concat() 可以用于合并两个或多个数组。它的用法是 array.concat(value1, value2, ..., valueX),其中 value1, value2, ..., valueX 是要连接的一个或多个数组或者非数组值。

语法示例:

let arr1 = [1];
let arr2 = [2];
let arr = arr1.concat(arr2);
console.log(arr); // [1, 2]

深拷贝

相比于浅拷贝,深拷贝可以将目标对象的属性递归地复制到一个新的对象或数组中,从而实现真正的拷贝,两个数据之间没有任何关联。但在实际开发中,深拷贝无疑更加消耗性能。实现深拷贝的方法主要有 JSON.parse(JSON.stringify()) 和递归方法。

方法一:JSON.parse(JSON.stringify())

在 JavaScript 中,可以使用 JSON.stringify() 方法将一个对象转换成一个 JSON 字符串,然后使用 JSON.parse() 方法将这个 JSON 字符串转换成一个新的对象,从而实现深拷贝。

语法示例:

let obj = { name: 'Bob', age: 18, hobby: ['reading', 'running'] };
let newObj = JSON.parse(JSON.stringify(obj));
console.log(newObj); // { name: 'Bob', age: 18, hobby: ['reading', 'running'] }

但这种方法有一些限制,它不能拷贝 undefined、function、Symbol 等特殊数据类型,也不能拷贝循环引用的数据结构。

方法二:递归方法

递归方法是另一种实现深拷贝的方式。它通过递归遍历每一个属性,将属性逐个复制到新的对象中。在递归过程中,需要判断属性的类型,如果是对象或数组,则继续递归复制,如果是基本数据类型,则直接赋值即可。

语法示例:

function deepClone(obj) {
  let newObj = obj instanceof Array ? [] : {};
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      if (typeof obj[key] === 'object') {
        newObj[key] = deepClone(obj[key]);
      } else {
        newObj[key] = obj[key];
      }
    }
  }
  return newObj;
}

let obj = { name: 'Bob', age: 18, hobby: ['reading', 'running'] };
let newObj = deepClone(obj);
console.log(newObj); // { name: 'Bob', age: 18, hobby: ['reading', 'running'] }

以上就是 JS 实现数组和对象的深浅拷贝的完整攻略,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js实现数组和对象的深浅拷贝 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • JavaScript中数据类型转换总结

    下面是JavaScript中数据类型转换总结的攻略: 数据类型转换总结 在JavaScript中,有些数据类型的值可以被隐式转换成其他类型的值。为了达到想要的结果,我们有时需要强制将某个数据类型转换成另一个数据类型。以下内容将介绍JavaScript中的数据类型转换。 1. 转换为数字 当需要将一个值转换成数字时,可以使用一元加运算符(+),或者Number…

    JavaScript 2023年5月28日
    00
  • js实现时间显示几天前、几小时前或者几分钟前的方法集锦

    实现时间显示几天前、几小时前或者几分钟前的方法,在前端开发中是比较常见的需求之一,下面我们来讲解一下相关的实现技巧和方法。 方法一:利用Moment.js库实现 Moment.js是一个便捷的日期处理类库,可以帮助我们轻松地完成日期和时间的格式化、解析和计算等操作。在基于Moment.js库实现的时间显示几天前、几小时前或者几分钟前的方法中,我们可以使用其巨…

    JavaScript 2023年5月27日
    00
  • JS小数转换为整数的方法分析

    下面是详细讲解“JS小数转换为整数的方法分析”的攻略: 问题背景 在JavaScript中,我们有时需要将小数转换成整数。例如,将0.3转换成3,或者将0.6转换成6。本文将介绍几种方法来实现这种转换。 方法一:乘法转换 此方法很简单,只需将小数乘以10的n次幂,其中n是小数点右侧的位数。然后将乘积四舍五入取整。这样就可以得到整数值。 function to…

    JavaScript 2023年5月28日
    00
  • Javascript基础知识(三)BOM,DOM总结

    Javascript基础知识(三)BOM,DOM总结 BOM(浏览器对象模型) 浏览器对象模型(BOM)提供了一组与浏览器窗口有关的对象,有助于操作浏览器窗口和屏幕显示。BOM是由浏览器厂商自行定义的,因此不属于W3C标准。 BOM的核心对象是window对象,表示浏览器窗口和页面。window对象还可以通过自身属性和方法来操作浏览器窗口、页面、框架、历史记…

    JavaScript 2023年6月10日
    00
  • JavaScript的ExtJS框架中表格的编写教程

    下面是JavaScript的ExtJS框架中表格的编写教程的完整攻略。 1. 概述 JavaScript的ExtJS框架提供了丰富的表格组件,能够满足各种需求。本攻略将详细介绍如何在ExtJS中编写表格组件。 2. 表格的基本结构 表格组件由表头和表格数据两部分组成。表头定义表格列的名称和宽度,表格数据为表格中实际展示的数据。 3. 表头的编写 表头的编写需…

    JavaScript 2023年6月10日
    00
  • Object的相关方法 和 js遍历对象的常用方法总结

    我会详细讲解“Object的相关方法和js遍历对象的常用方法总结”的完整攻略。 Object的相关方法 Object 是 JavaScript 的一个基础类型,它包含以下常用的方法: 创建对象 在 JavaScript 中,可以使用以下方法创建一个对象: 字面量方式 let obj = { prop1: ‘value1’, prop2: ‘value2’ }…

    JavaScript 2023年5月27日
    00
  • 一起来了解JavaScript面向对象

    一起来了解JavaScript面向对象 JavaScript是一种基于对象的编程语言。面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,其中数据和运算都是对象自己完成的,而不是由外部函数或数据指令完成的。 了解JavaScript中的对象 在JavaScript中,对象是一个复合数据类型,可以封装数据和方法。对…

    JavaScript 2023年5月18日
    00
  • 小程序中实现excel数据的批量导入的示例代码

    下面是关于“小程序中实现excel数据的批量导入的示例代码”的完整攻略。 准备工作 在进行excel数据批量导入前,我们需要做一些准备工作:1. 准备一个excel文件,并将需要导入的数据按照一定的顺序保存在sheet表格中。比如我们要导入学生的姓名、年龄、班级等信息,则需将这些信息对应的字段分别保存在不同的列中;2. 借助开发者工具,在小程序中新建一个页面…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部