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

yizhihongxing

浅拷贝和深拷贝是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日

相关文章

  • JavaScript数组类型Array相关的属性与方法详解

    一、JavaScript数组类型Array简介JavaScript中的数组(Array)是一种有序的数据集合,可以存储多个数据类型的值,访问数组中的元素可以通过下标或者索引的方式进行。 二、JavaScript数组类型Array相关的属性详解1. length:获取/设置数组的长度,也就是数组中元素的个数。示例一: let arr = [1, 2, 3, 4…

    JavaScript 2023年5月27日
    00
  • JS前端使用canvas实现物体的点选示例

    下面是“JS前端使用canvas实现物体的点选示例”的完整攻略: 简介 本攻略旨在帮助JS前端开发者使用canvas实现物体的点选功能。点选,即用户点击鼠标后能够判断该处是否落在某个物体上,从而实现交互操作。 准备 在开始编写代码前,需要准备以下工具和材料:- 编辑器:Visual Studio Code、Sublime Text、Atom等- 浏览器:Ch…

    JavaScript 2023年5月28日
    00
  • JavaScript实现的MD5算法完整实例

    JavaScript实现MD5算法完整实例攻略 简介 MD5是一种广泛使用的密码加密算法,它可以将任意长度的消息转换为128位的消息摘要。在实际开发过程中,我们需要使用MD5算法来保证密码等敏感信息的安全性。本文将讲解如何使用JavaScript实现MD5算法。 步骤 引入MD5库 我们可以在网上找到许多JavaScript实现MD5算法的库,如SparkM…

    JavaScript 2023年5月19日
    00
  • JS实现统计字符串中字符出现个数及最大个数功能示例

    下面我将详细讲解“JS实现统计字符串中字符出现个数及最大个数功能示例”的完整攻略。 1. 需求分析 在实现统计字符串中字符出现个数及最大个数功能之前,我们首先需要明确需求。具体来说,我们需要实现以下功能: 统计字符串中每个字符出现的个数; 找出出现次数最多的字符及其出现次数。 2. 实现思路 基于以上需求,我们可以采用以下步骤来实现: 遍历字符串中的每个字符…

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

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

    JavaScript 2023年5月28日
    00
  • JS获取html对象的几种方式介绍

    以下是关于JS获取html对象的几种方式的完整攻略: 1. 通过id获取对象 我们可以通过id来获取html对象。具体步骤如下: var obj = document.getElementById(‘idName’); 其中,’idName’是你想要获取的id名称。这个方法在页面中只能有一个元素拥有该id才能生效。 举个例子,如果你想获取以下html代码中的…

    JavaScript 2023年5月27日
    00
  • JavaScript高级程序设计 学习笔记 js高级技巧

    JavaScript高级程序设计 学习笔记 js高级技巧 概述 《JavaScript高级程序设计》是一本深入讲解JavaScript核心概念和高级技巧的经典著作。对于想要深入学习JavaScript的开发者来说,这本书是非常好的选择。本文将会分享我对该书学习过程的笔记和总结。 学习笔记 第一部分 基础知识 第一部分主要介绍了一些JavaScript的基础知…

    JavaScript 2023年5月18日
    00
  • jquery点击缩略图切换视频播放特效代码分享

    下面是详细讲解”jquery点击缩略图切换视频播放特效代码分享”的完整攻略: 1.需求概述 我们现在需要实现一个点击缩略图切换视频播放的特效,这里有两个核心需求: 点击不同的视频缩略图,展示不同的视频。 点击缩略图切换视频时需要加入过渡效果,让页面更加平滑流畅。 2.实现思路 实现一个点击缩略图切换视频的效果,首先需要用到jQuery库来实现相关的操作。 定…

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