JavaScript深拷贝与浅拷贝实现详解

JavaScript深拷贝与浅拷贝实现详解

什么是拷贝?

在JavaScript中,我们经常需要将对象或者数组进行复制操作,这被称为拷贝。在拷贝过程中,我们需要注意两个概念:浅拷贝和深拷贝。

什么是浅拷贝?

浅拷贝仅仅是复制了对象或数组的引用,而并没有克隆对象或数组。也就是说,对于被拷贝的对象或数组,它们的属性仍然指向原对象或数组中的属性。浅拷贝通常使用的方法有:

Object.assign方法

const obj = {a: 1, b: 2};
const copy = Object.assign({}, obj);
console.log(copy); // {a: 1, b: 2}

扩展运算符(...)

const obj = {a: 1, b: 2};
const copy = {...obj};
console.log(copy); // {a: 1, b: 2}

需要注意的是,浅拷贝只能复制对象或数组的一层属性,如果被拷贝的对象或数组中还有嵌套的对象或数组,浅拷贝并不会进行递归拷贝。

什么是深拷贝?

深拷贝则是完全复制了对象或数组,包括对象或数组中的所有嵌套对象或数组,新的对象或数组和原对象或数组完全独立无关。深拷贝通常使用的方法有:

JSON.parse和JSON.stringify方法

const obj = {a: 1, b: {c: 2}};
const copy = JSON.parse(JSON.stringify(obj));
console.log(copy); // {a: 1, b: {c: 2}}

需要注意的是,因为JSON.stringify方法无法处理Symbol、Date、函数等特殊类型,因此在深拷贝过程中这些类型会被忽略掉。

递归拷贝

function deepCopy(obj) {
  if (Array.isArray(obj)) {
    return obj.map(deepCopy);
  } else if (typeof obj === 'object' && obj !== null) {
    const copy = {};
    Object.keys(obj).forEach((key) => {
      copy[key] = deepCopy(obj[key]);
    });
    return copy;
  } else {
    return obj;
  }
}

const obj = {a: 1, b: {c: 2}};
const copy = deepCopy(obj);
console.log(copy); // {a: 1, b: {c: 2}}

递归拷贝可以完美地复制对象或数组中的所有属性,除了Symbol、Date、函数等特殊类型。

示例说明

示例一

const obj = {
  a: 1,
  b: {
    c: 2
  }
};
const copy1 = Object.assign({}, obj);
const copy2 = {...obj};
const copy3 = JSON.parse(JSON.stringify(obj));
const copy4 = deepCopy(obj);

obj.b.c = 3;

console.log(copy1); // {a: 1, b: {c: 3}}
console.log(copy2); // {a: 1, b: {c: 3}}
console.log(copy3); // {a: 1, b: {c: 2}}
console.log(copy4); // {a: 1, b: {c: 2}}

在这个示例中,我们首先定义了一个对象obj,其中包含一个嵌套对象b。然后我们使用了四种方法分别对obj进行了浅拷贝和深拷贝。接着,我们修改了obj.b.c的值为3,然后输出了四个拷贝的结果。可以看到,浅拷贝的两种方法都会随着原对象的改变而发生改变,而深拷贝的两种方法则不受原对象的影响。

示例二

const arr = [1, 2, [3, 4]];
const copy1 = arr.slice();
const copy2 = [...arr];
const copy3 = JSON.parse(JSON.stringify(arr));
const copy4 = deepCopy(arr);

arr[2][0] = 5;

console.log(copy1); // [1, 2, [5, 4]]
console.log(copy2); // [1, 2, [5, 4]]
console.log(copy3); // [1, 2, [3, 4]]
console.log(copy4); // [1, 2, [3, 4]]

在这个示例中,我们首先定义了一个数组arr,其中包含一个嵌套数组。然后我们使用了四种方法分别对arr进行了浅拷贝和深拷贝。接着,我们修改了arr[2][0]的值为5,然后输出了四个拷贝的结果。可以看到,浅拷贝的两种方法都会随着原数组的改变而发生改变,而深拷贝的两种方法则不受原数组的影响。

总结

浅拷贝和深拷贝是JavaScript中常用的拷贝方式,每种方式都有其优缺点。在实际应用中,我们需要根据具体的情况选择合适的拷贝方式,以保证拷贝的结果符合预期。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript深拷贝与浅拷贝实现详解 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 微信小程序实现计时器开始和结束功能

    微信小程序实现计时器开始和结束功能攻略 应用场景 计时器在我们日常生活活跃跑步、健身、制作食品等方面有着广泛的应用场景,在小程序中实现计时功能可以提升小程序的用户体验度。 实现思路 微信小程序提供了定时器API能力,我们只需要定义计时器的开始时间和结束时间,在每次执行时取当前时间和结束时间的差值,从而得到当前的计时器时间。我们可以通过wx.showModal…

    JavaScript 2023年6月11日
    00
  • javascript window.onerror事件学习新收获

    JavaScript Window.onerror事件学习新收获 什么是window.onerror事件? window.onerror 事件是在浏览器捕获到一个未处理的 JavaScript 错误时触发的事件。可以用来监听页面 JS 错误,并进行相应的处理,如记录错误信息、提示错误、上报错误等。 如何使用window.onerror事件? 在页面中添加以下…

    JavaScript 2023年5月28日
    00
  • C#基于正则表达式实现获取网页中所有信息的网页抓取类实例

    C#基于正则表达式实现获取网页中所有信息的网页抓取类实例 1. 前言 网页抓取是实现自动化数据采集、分析和处理的重要手段之一。本篇文章将介绍使用C#基于正则表达式实现获取网页中所有信息的网页抓取类实例。 2. 实现过程 2.1 步骤一:获取网页内容 使用C#自带的HttpClient类可以很方便地获取网页的原始内容。首先,我们需要先定义一个GetHtml方法…

    JavaScript 2023年6月10日
    00
  • JavaScript Math.floor方法(对数值向下取整)

    JavaScript Math.floor方法 Math.floor() 方法会返回小于等于所传参数的最大整数。 语法 Math.floor(x) 参数 x:必需。一个数值,将被下舍入为整数。 返回值 返回小于等于 x 的最大整数。 示例1:向下取整 var a = Math.floor(4.3); // 4 var b = Math.floor(9.999…

    JavaScript 2023年5月28日
    00
  • Javascript如何递归遍历本地文件夹

    在JavaScript中遍历本地文件夹可以使用Node.js的文件系统(fs)模块,递归遍历需要使用递归函数来实现。 以下是完整攻略: 1. 安装Node.js 在开发环境中,需要安装最新版的Node.js来执行JavaScript代码。Node.js可以在官网上下载:https://nodejs.org/。 2. 引入fs模块 在Node.js中,提供了一…

    JavaScript 2023年5月27日
    00
  • JavaScript cookie与session的使用及区别深入探究

    JavaScript Cookie与Session的使用及区别深入探究 概述 Web开发中,常常需要在用户与服务器之间保持状态,以便实现个性化的体验。在前后端分离的现代Web开发中,我们往往会在JavaScript中使用Cookie或Session来实现状态保持。而Cookie和Session虽然实现的目的相同,但它们的细节和机制存在很大的差异。在本文中,我…

    JavaScript 2023年6月11日
    00
  • 深入理解Ajax的get和post请求

    关于深入理解Ajax的get和post请求,下面是我分享的完整攻略。 理解Ajax 什么是Ajax? Ajax是“Asynchronous JavaScript And XML”的缩写,意思是“异步JavaScript和XML”。 简单来说,Ajax使得Web应用程序可以在不重新加载页面的情况下进行异步通信。 这意味着您可以使用JavaScript向服务器发…

    JavaScript 2023年6月11日
    00
  • javascript显示用户停留时间的简单实例

    JavaScript 显示用户停留时间的简单实例 在网页开发中,我们有时需要知道用户在页面上停留的时间。今天我们就来分享一下如何通过 JavaScript 显示用户停留时间的简单实例。 思路: 1.获取当前时间 2.当用户进入页面时开始记录时间 3.当用户离开页面时,计算时间差 4.将时间差显示在页面上 示例1:采用 Date() 对象获取时间 <!D…

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