js对象浅拷贝和深拷贝详解

JS对象浅拷贝和深拷贝详解

在JavaScript中,对象是非常重要的数据类型,它允许我们用键值对的形式来表示和存储数据。当我们需要复制一个对象时,需要了解什么是浅拷贝和什么是深拷贝。本文将详细解释这两种拷贝方式,并提供实例进行说明。

什么是浅拷贝

浅拷贝是指复制出来的新对象的属性是源对象的引用,而不是属性值的拷贝。也就是说,当源对象属性的值为对象或数组时,新对象中该属性仍然是一个指向该对象或数组的引用。简单来说,浅拷贝只拷贝对象的一层属性,而不拷贝对象中的子对象。

下面是一个浅拷贝的示例:

let obj1 = { name: "John", age: 30, hobbies: ["reading", "drawing"] };
let obj2 = Object.assign({}, obj1); // 使用Object.assign()方法进行浅拷贝

console.log(obj1.hobbies === obj2.hobbies); // true,说明hobbies属性是通过引用复制的

在上述示例中,我们使用了Object.assign()方法进行了浅拷贝。可以看到,obj2中的hobbies属性和obj1中的hobbies属性是同一个数组,这表明浅拷贝只是复制了定义在最外层的属性和属性值,而不是其中的子对象。

什么是深拷贝

深拷贝是指复制对象的所有属性及其子属性,复制后的对象与原对象完全独立,不会出现相互引用的情况。

下面是一个深拷贝的示例:

let obj1 = { name: "John", age: 30, hobbies: ["reading", "drawing"] };
let obj2 = JSON.parse(JSON.stringify(obj1)); // 使用JSON.parse和JSON.stringify方法进行深拷贝

console.log(obj1.hobbies === obj2.hobbies); // false,说明hobbies属性是通过值复制的

在上述示例中,我们使用了JSON.parse和JSON.stringify方法完成了深拷贝。可以看到,obj2中的hobbies属性已经不再是原来的数组了,而是一个新的数组,这表明深拷贝已经完全复制了对象及其所有子对象。

需要注意的是,使用以上的方法进行深拷贝,存在一些限制,例如无法复制函数,同时存在性能问题等。

如何选择合适的拷贝方式

在实际开发中,我们需要根据需要选择合适的拷贝方式。

如果对于拷贝的对象及其子对象没有修改的需求,那么使用浅拷贝就足够了。浅拷贝的效率更高,拷贝出来的对象更轻量级。例如,我们在从服务器获取数据并展示时,通常只需要浅拷贝一份数据。

如果需要对拷贝的对象及其子对象进行修改,那么使用深拷贝。深拷贝可以有效地避免修改原对象及其子对象的副作用,保证操作的安全性。

总结

本文详细讲解了JS对象浅拷贝和深拷贝的概念及区别,并提供了相应的示例进行说明。同时,也给出了选择合适拷贝方式的建议,希望对读者有所帮助。

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

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

相关文章

  • JS加载解析Markdown文档过程详解

    以下是详细的攻略,在此过程中,假设使用的是原生JS,没有使用任何外部库: 1. 获取Markdown文档内容 要加载Markdown文档,我们首先需要获取文件内容。可以使用XMLHttpRequest对象进行同步或异步的文件读取。这里我们以异步的方式读取Markdown文件。 function loadMarkdownFile(url, callback) …

    JavaScript 2023年5月27日
    00
  • javascript写的异步加载js文件函数(支持数组传参)

    让我详细讲解一下“javascript写的异步加载js文件函数(支持数组传参)”的完整攻略。 1. 异步加载JS文件的必要性 在网页开发中,我们经常需要引入一些外部的JS文件。正常情况下,我们通过在HTML页面的<head>标签或者<body>标签中添加<script>标签来实现JS文件的载入。但是,如果我们需要引入多个J…

    JavaScript 2023年5月27日
    00
  • JavaScript的DOM事件详解

    下面是JavaScript的DOM事件详解的完整攻略。 什么是DOM事件? DOM事件是指由DOM元素触发的事件,包括如下几种类型: 鼠标事件:click、mousedown、mousemove、mouseup、mouseover、mouseout、mouseenter、mouseleave等。 键盘事件:keydown、keypress、keyup等。 表…

    JavaScript 2023年6月10日
    00
  • 浅谈JavaScript函数节流

    浅谈 JavaScript 函数节流 函数节流(throttle)是一种优化高频执行函数的方法,它可以确保一定时间间隔内只执行一次函数。在一些需要触发频率比较高的事件,比如页面滚动、鼠标拖拽等事件中,使用函数节流可以有效提升页面性能。 基本实现原理 函数节流的基本实现原理是设置一个定时器,再限定在指定的时间内只触发一次函数。如果在等待的时间内再次触发函数,就…

    JavaScript 2023年5月19日
    00
  • javascript 判断数组是否已包含了某个元素的函数

    下面是关于“JavaScript 判断数组是否已包含了某个元素的函数”的完整攻略。 一、使用原生方法 includes() 最简单的方法是使用 JavaScript 数组的 includes() 方法,该方法会检查数组中是否存在某个元素,如果存在则返回 true,否则返回 false。 示例如下: const myArray = [1, 2, 3, 4, 5…

    JavaScript 2023年5月27日
    00
  • 用js重建星际争霸

    用JS重建星际争霸需要以下的步骤和技术: 基本准备 首先需要准备的是技术栈: HTML/CSS编写页面样式 Vue.js或React等框架来渲染视图和管理状态 WebGL(或者Three.js等封装库)来绘制3D场景 Node.js和Socket.io来实现多人游戏交互 同时需要准备游戏素材,在设计中包括以下元素: 战争迷雾和地图障碍 单位和建筑模型 动作和…

    JavaScript 2023年5月28日
    00
  • JavaScript reduce和reduceRight详解

    JavaScript reduce和reduceRight详解 什么是reduce方法? reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个元素从左到右依次调用该函数,并将累加器的返回值作为下一次调用该函数的参数。最终将返回累加器的最终值。 reduce() 可以实现一些非常复杂的累计逻辑,但它也是一个非常复杂的方法,需要花…

    JavaScript 2023年5月28日
    00
  • JS文件上传神器bootstrap fileinput详解

    JS文件上传神器bootstrap fileinput详解 1. 简介 bootstrap fileinput是一个基于Bootstrap框架的文件上传插件,具有丰富的功能和完善的文档。使用该插件,可以实现包括文件选择、预览、上传、删除等多种操作。 2. 安装 安装bootstrap fileinput的步骤如下: 引入相关CSS文件、JS文件和Bootst…

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