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中定义函数有两种方式:函数声明和函数表达式。虽然它们在外观上相似,但它们之间有许多关键差异。下面将详细介绍这两种方式的区别。 函数声明 函数声明是一种定义函数的方式,它使用关键字 function 以及函数名来创建函数。函数声明的语法如下: function functionName(parameter1, parameter2, ……

    JavaScript 2023年5月27日
    00
  • 深入理解JavaScript事件机制

    深入理解JavaScript事件机制 JavaScript的事件机制为我们在网页中开发交互体验提供了强大的支持。要深入理解JavaScript事件机制包括以下三个方面: 事件类型 事件模型 事件处理函数 事件类型 JavaScript中定义了很多事件类型,例如鼠标相关的事件类型包括: click 鼠标单击事件 dblclick 鼠标双击事件 mousedow…

    JavaScript 2023年6月11日
    00
  • 原生JavaScript实现幻灯片效果

    下面我会详细讲解一下“原生JavaScript实现幻灯片效果”的完整攻略。 1. 确定需求 在开始编写代码之前,我们需要考虑一下实现幻灯片效果的具体需求,例如: 幻灯片的图片数量 幻灯片每张图片的宽高 幻灯片切换的方式 幻灯片的自动播放和手动控制 2. 示范HTML结构 接下来,我们先来示范一下实现幻灯片效果所需要的HTML结构。代码如下: <div …

    JavaScript 2023年6月10日
    00
  • js脚本学习 比较实用的基础

    JS脚本学习 比较实用的基础攻略 前言 JavaScript是一种常用的编程语言,广泛用于Web前端和服务器后端开发,现如今几乎所有的网站都离不开JavaScript的支持。本文将介绍JS的一些脚本基础知识,以及一些实用的基础操作方法,旨在帮助初学者快速入门JS。 一、学习资源 MDN Web 文档是JS官方文档,包含了JS的语法、API、示例等详细资料。 …

    JavaScript 2023年6月11日
    00
  • jsp+ajax发送GET请求的方法

    当需要在JSP页面中使用ajax发送GET请求时,可以参照以下步骤进行操作: 步骤一:引入jQuery库文件 使用ajax发送请求时需要引入jQuery库文件。可以在head标签中使用以下代码引入: <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js&quot…

    JavaScript 2023年6月11日
    00
  • js获取当前时间显示在页面上并每秒刷新

    获取并显示当前时间是前端常见的需求之一。本文将提供一种基于JavaScript的实现方案,通过一个完整的示例演示如何实现“js获取当前时间显示在页面上并每秒刷新”。 方案概述 我们将使用JavaScript的Date对象获取当前时间,并将获取到的时间展示在网页上。为了实现每秒刷新,我们需要使用JavaScript中的定时器setInterval()函数。 具…

    JavaScript 2023年5月27日
    00
  • jQuery学习笔记之Ajax用法实例详解

    当你需要从服务器异步获取数据、并且能够在不刷新页面的情况下动态更新网页内容时,Ajax是一种非常有用的技术。jQuery中的Ajax封装简单易用,本篇文章将详细讲解jQuery的Ajax用法。 Ajax简介 Ajax即”Asynchronous JavaScript and XML”(异步JavaScript和XML),是一种用于创建快速动态网页的技术。通过…

    JavaScript 2023年5月19日
    00
  • 《javascript少儿编程》location术语总结

    当我们编写JavaScript代码时,经常会涉及到浏览器的位置(location)信息。例如,我们经常使用location.href来获取当前页面的URL,并且可以使用location.replace来替换当前页面,并跳转到另一个URL。 本文旨在帮助初学者更深入地理解浏览器位置相关的术语。以下是几个常见的浏览器位置术语: URL(Uniform Resou…

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