JS中实现浅拷贝和深拷贝的代码详解

浅拷贝和深拷贝是JavaScript中常用的两种复制对象的方法,两者的差别在于复制后对象所指向的地址是否相同。如果新生成的对象与原对象的内存地址相同,我们就称为浅拷贝;如果新生成的对象与原对象的内存地址不同,那么就称为深拷贝。

浅拷贝的实现

浅拷贝可以通过Object.assign()方法、扩展操作符或者遍历实现:

  1. Object.assign()方法实现浅拷贝
let target = {};
let source = {name: 'Peter', age: 25}
Object.assign(target, source);
console.log(target); // {name: 'Peter', age: 25}
  1. 扩展操作符实现浅拷贝
let target = {};
let source = {name: 'Peter', age: 25}
target = {...source};
console.log(target); // {name: 'Peter', age: 25}
  1. 遍历实现浅拷贝
let target = {};
let source = {name: 'Peter', age: 25}
for(let key in source) {
   target[key] = source[key];
}
console.log(target); // {name: 'Peter', age: 25}

深拷贝的实现

深拷贝可以通过遍历实现。遍历过程中需要判断当前的值是否为对象,如果是的话对该对象进行递归操作,并且复制得到的新对象仍然为深拷贝。

  1. JSON.parse()和JSON.stringify()实现深拷贝
let target = {};
let source = {name: 'Peter', age: 25, address : {city: '上海', zip: '200000'}}
target = JSON.parse(JSON.stringify(source));
console.log(target); // {name: 'Peter', age: 25, address : {city: '上海', zip: '200000'}}
  1. 递归实现深拷贝
function deepClone(obj) {
    if(obj === null) return null;
    if(typeof obj === 'object') {
        let newObj = obj.constructor === Array ? [] : {};
        for(let key in obj) {
            if(obj.hasOwnProperty(key)) {
                newObj[key] = deepClone(obj[key]);
            }
        }
        return newObj;
    } else {
        return obj;
    }
}

let target = {};
let source = {name: 'Peter', age: 25, address : {city: '上海', zip: '200000'}}
target = deepClone(source);
console.log(target); // {name: 'Peter', age: 25, address : {city: '上海', zip: '200000'}}

注意事项:递归实现深拷贝可能会在处理循环依赖的对象时,导致堆栈溢出,因此必须要考虑如何处理循环依赖问题。

以上就是JS中实现浅拷贝和深拷贝的代码详解,希望对你有所帮助。

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

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

相关文章

  • 原生JS实现前端本地文件上传

    当我们需要在前端实现文件上传的功能时,可以使用原生的JavaScript代码来实现。下面是一个完整的攻略,包含了前端上传文件需要用到的一些知识点。 1. 获取文件上传的节点 要上传文件,需要在页面上放置一个文件上传的节点,通常使用HTML中的<input type=”file” />元素。获取节点的方式可以使用原生JavaScript中的 get…

    JavaScript 2023年5月27日
    00
  • .net与javascript脚本的交互方法总结

    请看下面的详细解释。 如何在.NET和JavaScript之间进行交互 在.NET和JavaScript之间进行交互是一项非常强大的技术。以下是一些常用的.NET和JavaScript交互方法: 1. 使用Ajax/Web API 使用Ajax/Web API是一种非常常用的.NET和JavaScript交互方法。使用这种方法,您可以在服务器和客户端之间发送…

    JavaScript 2023年5月27日
    00
  • Javascript倒计时(定时)执行跳转事件的代码

    下面我将详细讲解“Javascript倒计时(定时)执行跳转事件的代码”的完整攻略。 目标 我们的目标是在网页上实现倒计时(定时)功能,到达指定的时间后自动跳转到某一个指定页面。 实现思路 实现该功能的思路如下: 获取当前时间和目标时间之间的时间差,并通过一定算法将其转换成剩余的天数、小时数、分钟数、秒数。 通过 JavaScript 中的 setInter…

    JavaScript 2023年5月27日
    00
  • JS中artdialog弹出框控件之提交表单思路详解

    下面详细讲解 “JS中artdialog弹出框控件之提交表单思路详解” 的攻略。 1. artDialog 弹出框控件 artDialog 是一款轻量级、可定制、无依赖、模块化的 JavaScript 弹出框控件。它能够实现在网页中弹出各种对话框,包括提示框、确认框、输入框以及自定义模板等等。artDialog 的优点在于易用、功能强大、配置灵活,同时还能够…

    JavaScript 2023年6月10日
    00
  • 常见的原始JS选择器使用方法总结

    常见的原始JS选择器使用方法总结 选择器是 JavaScript 编程中非常重要的一部分。选择器是用于访问和操作文档中的 HTML 元素的方法。 在 JavaScript 中,有多种类型的选择器,其中包含了基础选择器、层级选择器、伪选择器等。本文将总结常见的原始 JavaScript 选择器使用方法。 基础选择器 基础选择器是 JavaScript 中最常用…

    JavaScript 2023年6月10日
    00
  • 15个顶级开源JavaScript框架和库

    下面给您详细讲解关于“15个顶级开源JavaScript框架和库”的攻略。 1. 什么是JavaScript框架和库 JavaScript框架和库是用于JavaScript语言的代码集合,它们能够帮助开发者更便捷地构建应用程序。它们的目的是减少开发者的工作量、提高开发效率和代码可读性。 2. 常用的JavaScript框架和库种类 目前常用的JavaScri…

    JavaScript 2023年5月18日
    00
  • JS实现的抛物线运动效果示例

    下面我将为你详细讲解“JS实现的抛物线运动效果示例”的完整攻略。具体内容如下: 抛物线运动效果实现的原理 在实现抛物线运动效果之前,我们需要先了解它的基本原理。通俗地说,抛物线运动是指一种自由落体运动,其加速度大小保持不变,但方向发生变化,运动轨迹呈现抛物线形状。在应用中,我们可以通过以下公式来计算抛物线运动的位置: x = vx * t + x0; y =…

    JavaScript 2023年5月28日
    00
  • JS中的一些常用的函数式编程术语

    关于“JS中的一些常用的函数式编程术语”,下面是一份完整的攻略。 函数式编程术语简介 函数式编程是一种编程范式,它强调将计算过程看作是函数之间的相互调用。在函数式编程中,我们写的代码是由许多小的函数组成的,每个函数都是不可变的,并且不影响外部环境的状态。 在函数式编程中,有许多术语和概念,这些概念可以让你更好地理解函数式编程和编写更好的代码。 纯函数 在函数…

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