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日

相关文章

  • vue跳转方式(打开新页面)及传参操作示例

    下面是一份详细的关于Vue跳转方式及传参操作的攻略。 Vue 跳转方式 在Vue中,可以通过 <router-link> 或 $router.push() 的方式进行页面跳转。 router-link <router-link> 是Vue-Router提供的路由导航组件,可以通过 to 属性指定要跳转的路由地址。 语法如下: <…

    JavaScript 2023年6月11日
    00
  • 寒冬求职之你必须要懂的Web安全

    寒冬求职之你必须要懂的Web安全 在进行Web开发工作时,我们必须要重视Web安全问题,因为没有安全保障的系统极易受到黑客攻击,泄露用户信息和系统的机密数据。在寒冬求职过程中,Web安全知识的掌握也是很重要的,今天我将为大家分享一下Web安全的攻略。 了解常见的攻击方式 SQL注入攻击 SQL注入攻击是指攻击者在Web应用程序使用的SQL语句中注入恶意的SQ…

    JavaScript 2023年6月11日
    00
  • JavaScript版DateAdd和DateDiff函数代码

    下面是详细讲解“JavaScript版DateAdd和DateDiff函数代码”的完整攻略: 一、概述 在Web开发中,常常需要对日期进行操作。但是JavaScript原生的Date对象提供的方法较少,因此我们可以自己编写DateAdd和DateDiff函数来方便地进行日期计算。 DateAdd函数用于计算某个日期加上一定时间单位后的日期值,而DateDif…

    JavaScript 2023年5月27日
    00
  • javascript中有趣的反柯里化深入分析

    反柯里化(uncurrying)是一种将柯里化函数转换为普通函数的过程。JavaScript中的对象方法都是柯里化函数,即将this绑定在对象上来返回一个新函数。 反柯里化的主要目的是为了复用函数,在对象层级比较深的地方使用更为方便。 以下是javascript中有趣的反柯理化深入分析的完整攻略: 什么是反柯里化 1.1 柯里化 在JavaScript中,函…

    JavaScript 2023年6月10日
    00
  • 利用JavaScript制作一个酷炫的3D图片演示

    下面是详细讲解如何利用JavaScript制作一个酷炫的3D图片演示的完整攻略。 准备工作 在开始制作之前,需要先准备好以下内容: 确认浏览器支持 WebGL,对于不支持 WebGL 的浏览器需要添加 fallback 方案以便在不支持 WebGL 的浏览器上能够正常显示。 准备好可以用来渲染的 3D 图片模型,例如 OBJ 格式的 3D 模型。 学习 Th…

    JavaScript 2023年6月10日
    00
  • JS hasOwnProperty()方法检测一个属性是否是对象的自有属性的方法

    JS中的hasOwnProperty()方法是用来检测一个属性是否是某个对象的自有属性的方法。它是基于原型链的继承机制的,只有当所查询的属性是对象本身的属性时才会返回true。 语法: object.hasOwnProperty(prop) 其中object是必需的,表示要检查属性的对象,prop参数也是必需的,表示要检查的属性名称,传入的参数是字符串类型。…

    JavaScript 2023年6月10日
    00
  • vs2003 js文件编码问题的解决方法

    我来为您详细讲解如何解决Vs2003 JS文件编码问题。 问题描述 Vs2003在处理JS文件时,可能会出现编码不一致的问题。具体表现为,在编辑JS文件时,中文字符会出现乱码或者被替换成其他字符,导致代码意思无法理解。 解决方法 要解决这个问题,我们需要采取如下两个步骤: 步骤一:设置Vs2003默认编码格式 首先,我们需要在Vs2003中设置默认编码格式。…

    JavaScript 2023年5月20日
    00
  • JavaScript高阶教程之“==”隐藏下的类型转换

    JavaScript高阶教程之“==”隐藏下的类型转换 JavaScript中“==”操作符用于比较两个值是否相等,但它的隐藏规则是类型转换,如果两个值类型不同,会进行类型转换后再进行比较。本文将详细讲解“==”操作符隐藏的类型转换规则,以及如何正确地使用它。 基本类型转换规则 在JavaScript中,有7种基本数据类型:Undefined、Null、Bo…

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