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

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 对象是一种复合数据类型,可以包含键值对,并且可以使用点语法进行访问。对象通常用于封装相关的数据和功能,并将它们组织在一起。 对象字面量是创建 JavaScript 对象最常用的方法之一。对象字面量是使用花括号({})定义对象,每个键值对之间使用冒…

    JavaScript 2023年5月27日
    00
  • php用户注册页面利用js进行表单验证具体实例

    针对这个话题,以下是一个完整的攻略,希望对你有帮助。 第一步:准备基本的HTML代码 首先,你需要准备一个基本的HTML代码,包括表单元素和相关的JavaScript代码。下面是一个基本的模板示例: <!DOCTYPE html> <html> <head> <title>用户注册</title> …

    JavaScript 2023年6月10日
    00
  • JavaScript使用slice函数获取数组部分元素的方法

    获取数组部分元素是在我们日常的编程中非常常见的操作,JavaScript提供了slice()函数帮助我们实现这个功能。接下来我将为大家详细介绍slice函数的使用方法。 一、slice()函数概述 slice()函数用于获取数组的某一部分元素,它不会修改原数组,而是返回一个新的数组。slice()函数有两个参数,分别是起始索引和结束索引,其中起始索引是要获取…

    JavaScript 2023年5月27日
    00
  • JavaScript字符串转数字的5种方法及其陷阱

    JavaScript字符串转数字的5种方法及其陷阱 摘要 :JavaScript 是一个神奇的语言,字符串转数字有 5 种方法,各有各的坑法! 原文: Converting Strings to Number in Javascript: Pitfalls 译者: Fundebug 转载地址: 本文采用意译,版权归原作者所有 String 转换为 Numbe…

    JavaScript 2023年4月18日
    00
  • 深浅拷贝,温故知新

    1、深拷贝 1.1、概念 对象的深拷贝是指其属性与其拷贝的源对象的属性不共享相同的引用(指向相同的底层值)的副本。 因此,当你更改源或副本时,可以确保不会导致其他对象也发生更改;也就是说,你不会无意中对源或副本造成意料之外的更改。 在深拷贝中,源和副本是完全独立的。深拷贝与其源对象不共享引用,所以对深拷贝所做的任何更改都不会影响源对象。 1.2、实现方式: …

    JavaScript 2023年5月11日
    00
  • 详解JavaScript正则表达式中的global属性的使用

    详解JavaScript正则表达式中的global属性的使用 在 JavaScript 中,正则表达式(RegExp)是一个很常用的工具,它用于匹配和操作字符串。其中,g 属性(global)是非常重要的一个属性,本篇文章将详细讲解如何使用 global 属性来进行全局匹配。 什么是 global 属性? g(global)属性用于指定在整个文本中查找所有匹…

    JavaScript 2023年6月10日
    00
  • 解决页面js接受Long型损失精度问题(最新解决方案)

    解决页面JS接受Long型损失精度问题(最新解决方案) 在前后端分离的架构下,我们经常需要通过网络传输Long类型的数据,在前端进行处理。但是,由于JS中Number类型采用IEEE 754双精度浮点数表示,会存在精度损失的问题。而Long类型的数据更倾向于采用Java或C++等强类型语言进行处理,因此我们需要找到一种前端解决方案。 方案一:采用BigInt…

    JavaScript 2023年5月28日
    00
  • 在react中使用mockjs的方法你知道吗

    当我们需要模拟一个后端API接口,来测试前端代码的时候,可以使用mockjs这个库进行模拟数据。下面是在React中使用mockjs的方法: 1. 安装mockjs npm install mockjs –save-dev 2. 创建mock数据 我们可以在src目录下新建一个mock目录,然后在这个目录下再新建一个data.js文件。在这个文件中,就可以…

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