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

yizhihongxing

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日

相关文章

  • Javascript实现跨域后台设置拦截的方法详解

    下面是“Javascript实现跨域后台设置拦截的方法详解”的完整攻略。 什么是跨域 跨域指的是在一个网页加载另一个网页的资源时,由于受到安全限制,无法读取对方资源的问题。比如从A站点的网页向B站点发送AJAX请求的过程中,如果B站点的资源不允许A站点的请求,就会产生跨域问题。 为什么需要防止跨域 跨域攻击是指攻击者利用目标网站对跨域问题的缺乏安全防范措施,…

    JavaScript 2023年6月11日
    00
  • JS中的算法与数据结构之集合(Set)实例详解

    JS中的算法与数据结构之集合(Set)实例详解 1. 什么是Set? Set 是ES6新增的数据结构,它是一种无序且唯一的数据集合,类似于数组,但是它不允许有相同的元素存在,可以用来存储任何类型的值(对象,字符串,数字等)。 Set可以显著地提高数据读取效率和数据去重的效果。 2. Set的使用方法 2.1 创建Set并添加元素 // 创建set const…

    JavaScript 2023年5月28日
    00
  • JS中的箭头函数

    在JavaScript中,箭头函数是一种简化的函数语法,它在ES6(ECMAScript 2015)引入。箭头函数的语法比传统的function表达式更简洁,同时还有一些特性,例如继承外部作用域的this值。 箭头函数的基本语法如下: (param1, param2, …, paramN) => { statements } (param1, pa…

    JavaScript 2023年5月11日
    00
  • JAVA面试题 static关键字详解

    JAVA面试题 static关键字详解 在Java中,static是一种关键字(也称为修饰符),它可以修饰类、方法和变量。在这篇文章中,我们将详细讨论关于static关键字的使用、作用以及我们在面试中可能会遇到的相关问题。 一、static关键字的使用 1.1 类和方法 在Java中,我们可以使用static修饰一个类,使其变成静态类。静态类可以不需要实例化…

    JavaScript 2023年5月28日
    00
  • js精准的倒计时函数分享

    下面我将为你详细讲解“JS 精准的倒计时函数分享”的完整攻略。 简介 在网站中,倒计时是一个非常常见的功能,比如购物网站中的秒杀倒计时、新年倒计时等等。JS 精准的倒计时函数可以用来方便地实现这些功能,本文将介绍如何实现该函数。 准备工作 首先,我们需要准备一个用来显示倒计时的元素以及倒计时结束后需要执行的操作。比如要实现新年倒计时,我们需要准备一个显示时间…

    JavaScript 2023年5月27日
    00
  • 原生js操作checkbox用document.getElementById实现

    原生JS操作checkbox用document.getElementById实现的步骤如下: 1.在HTML页面中添加checkbox元素: <input type="checkbox" id="myCheckbox">My Checkbox</input> 2.在JS文件中使用document…

    JavaScript 2023年6月10日
    00
  • requestAnimationFrame定时动画屏幕刷新率节流示例浅析

    下面我详细讲解一下“requestAnimationFrame定时动画屏幕刷新率节流示例浅析”的攻略。 简介 window.requestAnimationFrame() 是一个 JavaScript 函数,可用于通过浏览器的渲染引擎,来以最佳频率更新显示屏幕上的动画。 在某些情况下,使用 requestAnimationFrame() 可以连续重复执行某个…

    JavaScript 2023年6月11日
    00
  • JavaScript的数据类型转换原则(干货)

    JavaScript的数据类型转换原则(干货) 1. 数据类型转换的基本原则 在JavaScript中,我们经常需要将不同类型的数据进行转换,特别是在进行运算、比较和赋值等操作的时候。因此,了解数据类型转换的基本原则对于编写高质量的JavaScript代码是非常重要的。 1.1. 隐式类型转换 JavaScript中有两种类型转换方式:显式类型转换和隐式类型…

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