首页 > 编程语言 >深拷贝与浅拷贝:JavaScript 里的“复制粘贴”大作战

深拷贝与浅拷贝:JavaScript 里的“复制粘贴”大作战

时间:2024-10-13 17:19:16浏览次数:8  
标签:吃火锅 朋友 JavaScript 打游戏 复制粘贴 hobbies 拷贝 original

在 JavaScript 的世界里,复制对象就像是在玩“传声筒”游戏,听着听着就乱了套。今天,我们要聊聊两个“复制”大法:深拷贝浅拷贝。他们就像是“有深度的朋友”和“表面交情的朋友”,那么到底有什么区别呢?让我们一起看看!


1. 浅拷贝:表面交情

浅拷贝就像你和朋友一起去吃火锅,你们的火锅底料(对象)是一样的,但你们的配菜(嵌套属性)其实是共享的。你点了羊肉卷,他点了鱼豆腐,最后大家的汤底都被调味得“天昏地暗”——谁知道你吃了几块鱼豆腐,谁也不清楚。

示例代码:
let original = {
    name: '小明',
    hobbies: ['打游戏', '吃火锅']
};

// 使用扩展运算符进行浅拷贝
let shallowCopy = { ...original };

// 修改浅拷贝的嵌套属性
shallowCopy.hobbies.push('唱歌');

console.log(original.hobbies); // ['打游戏', '吃火锅', '唱歌'],原对象也被修改了!
深度解析

这就好比你在朋友圈发了一张“吃火锅”的照片,底下有十个朋友评论:“我也想吃”,结果你一转身,锅里的鱼豆腐就没了——你以为是自己吃的,谁知道其实是朋友们的口水共用的锅底呀!


2. 深拷贝:有深度的朋友

深拷贝就像你和朋友一起参加活动,各自准备了自己的东西,互不影响。你的背包里有零食,他的背包里有水,两个背包都很丰富,但里边的东西完全独立。

示例代码:
let original = {
    name: '小明',
    hobbies: ['打游戏', '吃火锅']
};

// 使用 JSON.parse 和 JSON.stringify 实现深拷贝
let deepCopy = JSON.parse(JSON.stringify(original));

// 修改深拷贝的嵌套属性
deepCopy.hobbies.push('唱歌');

console.log(original.hobbies); // ['打游戏', '吃火锅'],原对象未受影响
深度解析

就像你和朋友一起拍“美食照”,你们分别带了自己的食物,互相吃不到对方的。你吃薯条,他吃炸鸡,最后谁都不会感到“饿狼来了”。这就是深拷贝的魅力!你吃你的,他吃他的,完美独立,彼此不干扰。


3. 浅拷贝 vs 深拷贝:小总结

  • 浅拷贝:表面交情,最外层的属性复制,嵌套属性共享,互相影响。就像是共同看了一场电影,朋友看完后和你讨论剧情,结果剧透了!

  • 深拷贝:有深度的朋友,整个对象递归复制,彼此独立。就像每人都能单独看电影,吃完后各自分享感受,完全不会剧透!


4. 选择时机:什么情况下用浅拷贝,什么情况下用深拷贝?

  • 浅拷贝:当你觉得和朋友们分享“口水”的对象时,当然用浅拷贝啦!适合简单的对象,大家一起交流,快乐就好。

  • 深拷贝:如果你想保留自己独特的想法,避免“互相影响”,那就得深拷贝了!适合复杂的对象,确保不会被朋友的“口水”弄脏自己的“火锅”。


5. 小结:拷贝大作战

所以,记住:浅拷贝就像是“我借你我的外套,里面的东西你别动”,而深拷贝就像“我给你买一件全新的外套,保证你自己的口袋里啥都有”。

结尾解析:这就像是“我有一个朋友”,你们的友情只停留在表面(浅拷贝),一旦深入就会互相影响;而真正的“深交”就得是彼此有自己的一亩三分地(深拷贝),互不干扰,才能让友情长长久久哦!

标签:吃火锅,朋友,JavaScript,打游戏,复制粘贴,hobbies,拷贝,original
From: https://blog.csdn.net/qq_44996048/article/details/142900947

相关文章

  • Javascript笔试手撕题目大全
    1.如何使用JS模拟实现instanceof操作符?请写出具体代码方法描述优点缺点typeof 运算符返回变量的数据类型(对于基本类型很有效,但对于对象和数组返回 "object")简洁易用,适用于基本类型判断无法准确判断 null(返回 "object")和复杂对象/数组的类型instanceof 运算符检查对象是......
  • 前端知识整理(全屏播放器 CSS JavaScript 轮转播放 jquery库 AJAX 画布 网页测试)
    currenttime在前端开发中,“currenttime”通常指的是获取用户设备的当前时间。这可以通过JavaScript来实现,下面是一个简单的示例代码,展示如何获取并显示当前时间:<!DOCTYPEhtml><html><head><title>显示当前时间</title></head><body><h1>当前时间:</h1><pid="d......
  • 大学生HTML期末大作业——HTML+CSS+JavaScript游戏网站(英雄联盟)
    HTML+CSS+JS【游戏网站】网页设计期末课程大作业web前端开发技术web课程设计网页规划与设计......
  • JavaScript中的DOM和Timer(简单易用的基本操作)
    JavaScript中的DOM和Timer基本操作DOM操作传统的选择器选择器idvarelements=document.getElementById(id的名称);例如:varelements=document.getElementById("test");选择id为test的标签选择器classvarelements=document.getElementsByClassName(class的名称);......
  • javascript学习——算术运算符
    算术运算符运算符是处理数据的基本方法,用来从现有的值得到新的值。JavaScript提供了多种运算符,覆盖了所有主要的运算。概述JavaScript共提供10个算术运算符,用来完成基本的算术运算。加法运算符:x+y减法运算符:x-y乘法运算符:x*y除法运算符:x/y指数运算符:x**y......
  • javascript学习——二进制位运算符
    二进制位运算符概述二进制位运算符用于直接对二进制位进行计算,一共有7个。二进制或运算符(or):符号为|,表示若两个二进制位都为0,则结果为0,否则为1。二进制与运算符(and):符号为&,表示若两个二进制位都为1,则结果为1,否则为0。二进制否运算符(not):符号为~,表示对一个二进制位取反。异或......
  • JavaScript中的流程控制(顺序结构、分支结构、循环结构)
    流程控制1.概念在一个程序执行的过程中,各条代码的执行顺序对程序的结果是有直接影响的,很多时候要通过控制代码的执行顺序来实现我们完成的功能简单的理解:流程控制就是控制代码,按照一定的结构顺序来执行流程控制的分类:顺序结构分支结构循环结构2.顺序流程控......
  • JavaScript原型链污染探讨
    如果你想弄明白什么怎样才可以实现JavaScript的原型链污染,那么你首先需要弄清楚两个东西,那就是__proto__和prototype。到底什么才是__proto__和prototype?那我们先来看看比较官方的说法吧:__proto__:是每个对象的隐藏属性,指向创建该对象的构造函数的原型对象(prototype)。它是对象......
  • JavaScript进阶笔记--深入对象-内置构造函数及案例
    深入对象创建对象三种方式利用对象字面量newObject({…})利用构造函数//1.字面量创建对象constobj1={name:'pig',age:18};console.log(obj1);//{name:"pig",age:18}//2.构造函数创建对象functionPig(name,age){......
  • JavaScript 异步编程入门
    最近开始不断学习实践JavaScript,出于性能测试的敏感,首先研究了JavaScript的异步编程实践,目前看跟之前学过的Java和Go都不太一样。使用的语法上相对更加复杂,也可能因为我实践得还太少。异步编程异步编程是一种在程序执行过程中,不阻塞主线程的任务处理方式。相较于同步编程......