JavaScript实现浅拷贝与深拷贝的方法分析

当我们需要在JavaScript中复制对象时,我们通常会使用浅拷贝或深拷贝,这两种方法可以实现不同程度的对象复制。下面是实现浅拷贝和深拷贝的方法分析:

实现 JavaScript 浅拷贝的方法

JavaScript中使用浅拷贝来复制对象,只是复制了对象的引用,因此,这个新创建的对象和旧对象指向相同的内存地址。这意味着,如果我们修改新对象中的某个属性,则旧对象和新对象中的这个属性都会受到影响。

以下为实现JavaScript浅拷贝的方法:

1. Object.assign()

Object.assign()方法用于将一个或多个来源对象的属性复制到目标对象,它会将源对象的 properties 复制到目标对象上并返回目标对象。这个方法执行时会对 first argument 执行ToObject 转换,因此,其可以处理原始类型变量(原始类型变量会被封装成对象),但是我们必须确保传递的第一个参数不是null或undefined。

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

2. 扩展运算符

ES6的扩展运算符允许我们使用三个点(...)运算符将一个对象展开为多个元素并将其赋值给一个新的对象。在 JavaScript 中,它可以用来实现浅拷贝。以下是示例:

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

实现 JavaScript 深拷贝的方法

JavaScript中使用深拷贝时,会创建一个对象的完全副本,并在内存中分配新的空间,在新的对象内存中存储这个副本。这意味着,如果我们修改新对象中的某个属性,则旧对象不会受到影响。

以下为实现JavaScript深拷贝的方法:

1. JSON.parse() 和 JSON.stringify()

JSON.parse()和JSON.stringify()是 JSON 格式的一部分,它们可以用于创建 JavaScript 中的对象。通过使用明确的 JSON.parse()和JSON.stringify() API,我们可以在一个新的对象中创建原始对象的副本。JSON.stringify()可以将一个JavaScript对象的属性序列化成 JSON 字符串,而JSON.parse()则可以将JSON字符串解析为 JavaScript对象。

以下为实现深拷贝的示例代码:

let obj1 = {a: 1, b: 2, c: {d: 3, e: 4}};
let obj2 = JSON.parse(JSON.stringify(obj1));
console.log(obj2); // {a: 1, b: 2, c: {d: 3, e: 4}}

但是,当对象中包含函数、RegExp、Date等类型时,这种方式并不适用。原因是这些类型无法在 JSON 格式下进行有效的序列化和反序列化。

2. 递归

使用递归是实现JavaScript深拷贝的另一种方式。这个方法需要自己编写代码实现,因此需要我们对对象实际的结构和属性进行了解。我们可以根据该对象的属性的类型来进行不同的操作。

以下是实现深拷贝的示例代码:

function deepClone(obj) {
  if (typeof obj !== 'object' || obj === null)
    return obj;
  let clone = Object.assign({}, obj);
  Object.keys(clone).forEach(key => {
    clone[key] = deepClone(obj[key]);
  });
  return Array.isArray(obj) ? (clone.length = obj.length && Array.from(clone)) : clone;
}

let obj1 = {a: 1, b: 2, c: {d: 3, e: 4}};
let obj2 = deepClone(obj1);
console.log(obj2); // {a: 1, b: 2, c: {d: 3, e: 4}}

该方法首先检查要复制的对象属性的类型,然后通过Object.assign()方法复制对象的基本属性。然后它使用递归方法来检查对象属性的类型和值,并复制它们。如果属性值是对象,则递归调用deepClone()函数来继续复制对象,直到它可以复制整个对象。

以上就是实现JavaScript浅拷贝和深拷贝的方法分析和示例说明。

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

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

相关文章

  • vue 获取视频时长的实例代码

    获取视频时长是一个常见的需求,Vue 作为一个流行的前端框架,提供了一些方便的方式来完成这个任务。本文将介绍如何使用 Vue 获取视频时长的实例代码和操作步骤。 步骤一:设置 HTML5 video 元素 首先,我们需要在页面上添加一个 HTML5 video 标签,用于加载视频。下面是一个简单的示例: <template> <video …

    Vue 2023年5月29日
    00
  • vue-cli3配置favicon.ico和title的流程

    下面是“vue-cli3配置favicon.ico和title的流程”的完整攻略。 1. 配置favicon.ico 在Vue CLI 3中,如果要设置自定义网站标识图标(favicon.ico),需要按照以下步骤进行操作: 在项目根目录下创建一个名为public的文件夹; 在public文件夹中放置一个名为favicon.ico的文件,该文件即为自定义的网…

    Vue 2023年5月27日
    00
  • vuex的几个属性及其使用传参方式

    好的!下面是有关Vuex的属性及其使用方法的详细攻略。 Vuex属性 State – 状态属性 State是Vuex中存放数据的地方。它的作用是承载用户数据及当前应用的状态信息。在组件中通过$store.state来获取数据。 Getter – 获取属性 Getter是vuex中用于从状态层中获取数据的函数。Getter可以对State中的数据进行二次处理后…

    Vue 2023年5月28日
    00
  • Vue前端如何实现生成PDF并下载功能详解

    生成PDF并下载功能是许多Web应用程序需要的一个重要功能,为Vue项目添加PDF的生成可以满足这些需求。在Vue前端如何实现生成PDF并下载功能的攻略中,需要完成以下步骤: 第一步:安装依赖 首先需要安装一个支持PDF生成的依赖包jspdf,方法如下: npm install jspdf –save 第二步:编写Vue组件 在Vue组件中,通过创建画布和…

    Vue 2023年5月27日
    00
  • Vue-cli配置打包文件本地使用的教程图解

    下面我为大家详细讲解“Vue-cli配置打包文件本地使用的教程图解”的完整攻略。 一、前置知识 在介绍如何配置Vue-cli打包文件本地使用前,我们需要先了解以下几个概念: Vue-cli:Vue-cli是Vue.js官方提供的一个脚手架工具,通过Vue-cli快速生成Vue项目目录结构和配置,并支持开箱即用的webpack构建工具。 webpack:web…

    Vue 2023年5月28日
    00
  • vue编写的功能强大的swagger-ui页面及使用方式

    什么是Swagger-UI页面? Swagger UI是一个通过注解的方式为 RESTful API 描述文档生成在线文档界面的工具。通过Swagger UI,我们可以详细地查看到API接口的信息,包括接口名称、接口描述、请求地址、请求方式、参数类型、参数描述、响应状态码等等。Swagger UI可以很方便地帮助我们对API接口进行测试与调试。 如何使用Vu…

    Vue 2023年5月28日
    00
  • 详解Vue.js中引入图片路径的几种方式

    让我来对“详解Vue.js中引入图片路径的几种方式”进行详细讲解。 一、使用相对路径 在Vue.js中,你可以使用相对路径来引入图片,比如: <img src="./assets/images/logo.png" alt="logo"> 上面的代码中,./表示当前文件夹,然后assets/images/lo…

    Vue 2023年5月28日
    00
  • 一篇文章总结Vue3.2语法糖使用

    一篇文章总结Vue3.2语法糖使用 简介 Vue.js是一款流行的前端JavaScript框架,而Vue 3是其最新版本,其中引入了一些方便开发的新特性,即语法糖。本篇文章将讲解Vue3.2语法糖的使用方法。 defineComponent函数 在Vue3中,我们可以使用defineComponent函数定义组件,它可以让代码更加简洁明了。下面是一个使用de…

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