【前端】对象的常用处理函数(深浅拷贝)

前言

浅拷贝会创建一个新对象,但只复制了原始对象的第一层属性,而不是递归地复制整个对象的所有嵌套属性。因此,新对象中的嵌套对象仍然是原始对象中嵌套对象的引用。这意味着修改新对象中的嵌套对象会影响原始对象中的相应嵌套对象

深拷贝会创建一个全新的对象,同时递归地复制原始对象中的所有嵌套对象,使得新对象和原始对象完全独立,彼此不会互相影响

经过代码测试,个人理解:一个对象只有一层而且没有引用类型(对象|数组)时候,用浅拷贝的方法(),效果和深拷贝是一样,因为
对于基本数据类型(如数字、字符串等),新对象会复制它们的值而不是引用。

深拷贝实现

1、 JSON.parse(JSON.stringify(obj))
2、第三方lodash里的cloneDeep方法
3、递归方法

// add by fourfaith源码 https://github.com/JakHuang/form-generator/blob/dev/src/utils/index.js#L107
export function deepClone(obj) {const _toString = Object.prototype.toString// null, undefined, non-object, functionif (!obj || typeof obj !== 'object') {return obj}// DOM Nodeif (obj.nodeType && 'cloneNode' in obj) {return obj.cloneNode(true)}// Dateif (_toString.call(obj) === '[object Date]') {return new Date(obj.getTime())}// RegExpif (_toString.call(obj) === '[object RegExp]') {const flags = []if (obj.global) { flags.push('g') }if (obj.multiline) { flags.push('m') }if (obj.ignoreCase) { flags.push('i') }return new RegExp(obj.source, flags.join(''))}const result = Array.isArray(obj) ? [] : obj.constructor ? new obj.constructor() : {}for (const key in obj) {result[key] = deepClone(obj[key])}return result
}

浅拷贝实现

1、扩展运算符

const original = { a: 1, b: 2 };
const shallowCopy = { ...original };

2、Object.assign() 方法

const original = { a: 1, b: 2 };
const shallowCopy = Object.assign({}, original);

3、Array.prototype.slice() 方法(适用于数组)

const originalArray = [1, 2, 3];
const shallowCopyArray = originalArray.slice();

4、Array.prototype.concat() 方法(适用于数组)

const originalArray = [1, 2, 3];
const shallowCopyArray = originalArray.concat();

常用函数

TODO

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><div>对象测试</div></body><script>const obj = {id: '1',name: '小维',}const temp1 = []const lucky = () => {Object.keys(obj).forEach((key) => {console.log(obj[key])temp1.push(obj[key])})}const temp2 = Object.values(obj)lucky()//下面2个打印都是一样的,value合集的数组console.log(temp1) //['1', '小维']console.log(temp2) //['1', '小维']//传入字符串or数组都是返回索引const str = 'abcde'const arr = ['a', 'b', 'c', 'd', 'e']console.log(Object.keys(arr)) //[0,1,2,3,4]console.log(Object.keys(str)) //[0,1,2,3,4]//可深浅拷贝 Object.assign(target, source_1, ···)let target = { name: '小艾 ' }let source = { age: 20 } //就一层对象是深拷贝,如果里面还有{},那么就是浅拷贝let obj1 = Object.assign(target, source)console.log(source) //{ age: 20}console.log(obj1) //{name: '小艾 ', age: 20}source.name = '小维'let obj2 = Object.assign(target, source) // 如果目标对象和源对象有同名属性,则后面的属性会覆盖前面的属性console.log(obj2) //{name: '小维', age: 20}console.log(obj1) //{name: '小维', age: 20}console.log(target) //{name: '小维', age: 20}//深拷贝let deepClone = JSON.parse(JSON.stringify(target))target.name = '小羊'console.log(deepClone) //{name: '小维', age: 20}deepClone.name = '小明'console.log(target) //{name: '小羊', age: 20};//将对象转为数组格式const obj3 = {name: 'LUCKY',age: 20,}const arrLucky = Object.entries(obj3)console.log(arrLucky) //[['name', 'LUCKY'], ['age', 20]]//将上面这种转对象 适合将 Map 结构转为对象const obj4 = Object.fromEntries(arrLucky)console.log(obj4) //{name: 'LUCKY', age: 20}//删除属性delete obj3.nameconsole.log(obj3) //{age: 20}let { name, ...params } = target //除了name属性以外的target对象中的所有其他属性console.log(params) //{age: 20}//Object.assign 测试值变化const objN = {name: '坤',age: 24,info: {test: 'zz',},}const test = {kun: 'ngm',}const newObjN = Object.assign(test, objN)objN.age = 25test.age = 26test.info.test = 'NN'console.log(objN, newObjN, test) //发现age无法影响objN的值console.log(objN, newObjN, test) //发现info里的test影响objN的值const original = { a: 1, b: 2, info: { name: '小维' }, arr: [1, 2, 3] }const shallowCopy = { ...original }// shallowCopy.arr = [3, 5] //不触发,引用地址变化shallowCopy.arr[0] = 34 //这样才会触发浅拷贝console.log(shallowCopy, original)</script>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/4927.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++常用的输入输出方法(ACM模式)

文章目录 前言一、输入输出方法1、cin2、getline()3、getchar() 二、算法案例1、一维数组1.1 输入固定长度1.2长度不固定 2、固定二维数组3、以非空格隔开的元素输入3、常见数据结构定义以及输入3.1 链表 前言 C中的输入输出函数有很多&#xff0c;我们本章只针对大部分算法题…

上位机图像处理和嵌入式模块部署(树莓派4b开机界面程序自启动)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们学习了如何在树莓派4b上面开发qt&#xff0c;也学习了如何用/etc/rc.local启动控制台程序&#xff0c;那今天我们继续学习一下如何利用树莓…

docker compose安装redis

一、安装准备 在docker hub查看redis镜像版本。查看地址如下&#xff1a; Dockerhttps://hub-stage.docker.com/_/redis/tags 二、拉取docker镜像 我这里用redis:6.2.14版本&#xff0c;先拉取镜像。命令如下&#xff1a; docker pull redis:6.2.14 查看刚刚下载的镜像&am…

链表的从尾到头打印(递归)

目录 链表的从尾到头打印&#xff08;递归&#xff09; 链表的从尾到头打印&#xff08;递归&#xff09; 递归打印链表 #include <bits/stdc.h> using namespace std;void coutls(list<int>::iterator iter, list<int>::iterator node_end){if (iter!node…

[python数据处理系列] 深入理解与实践基于聚类的过采样与欠采样技术:以K-Means为例

目录 一、过采样介绍 (一)什么是过采样 (二)过采样的优点 (三)过采样的缺点 二、欠采样介绍 (一)什么是欠采样 (二)欠采样的优点 (三)欠采样的缺点 三、基于聚类的欠抽样方法(K-Means欠采样/KMeans-Undersampling) (一)KMeans欠采样原理及其步骤介绍 (二)为什么不采…

clickhouse学习笔记05

ClickHouseSpringBoot2.XMybatisPlus整合搭建 添加需要的依赖&#xff1a; 添加clickhouse依赖&#xff1a; 配置数据库配置&#xff1a; 我们框架就搭建完了。 ClickHouse的项目案例统计需求讲解 ClickHouse的项目案例统计库表和数据准备 添加数据&#xff1a; 数据都插入进来…

js逆向进阶篇-某团酒店

提示!本文章仅供学习交流,严禁用于任何商业和非法用途,未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,如有侵权,可联系本文作者删除! 案例分析: 先来看看请求中有哪些参数是需要我们逆向,如下: mtgsig、fp、roh…

ERROR: [7df2405] missing Change-Id in commit message footer

git push origin HEAD:refs/for/[分支名] 使用“git push origin HEAD:refs/for/[分支名]”,报错信息见下图 报错信息:ERROR: [7df2405] missing Change-Id in commit message footer 解决办法 根据git的提示依次执行下面的语句即可 第一步:输入下面的语句,下载一个 g…

Java---数据类型与变量

1.字面常量 字面常量就是我们经常所说的常量&#xff0c;常量即在程序运行期间&#xff0c;固定不变的量。且常量是无法改变的&#xff0c;如果我们的代码有改变常量的操作&#xff0c;程序就会报错。 1.1字面常量的分类 字符串常量&#xff0c;整型常量&#xff0c;浮点数常…

FileLink内外网文件摆渡系统产品介绍

在现代企业中&#xff0c;往往存在着多个网络、系统之间的数据孤岛问题&#xff0c;数据难以互相访问和共享。 一、常用的内外网文件摆渡方式 传统的数据交换方式往往需要人工介入&#xff0c;效率低下且容易出错。如&#xff1a;U盘、FTP、VPN等&#xff0c;极易引发各种各样…

Mysql事务—隔离级别—脏读、不可重复读、幻读-遥遥领先版

事务的基本概念 事务就是一组原子性的操作&#xff0c;这些操作要么全部发生&#xff0c;要么全部不发生。事务把数据库从一种一致性状态转换成另一种一致性状态。 事务最经典也经常被拿出来说例子就是转账了。 假如小明要给小红转账1000元&#xff0c;这个转账会涉及到两个…

libcudart.so.10.2: cannot open shared object file: No such file or directory

文章目录 整体过程细节在虚拟环境中安装cuda 10.2在虚拟环境中安装cuda 12.1 整体过程 首先出现这个报错说明在/usr/local/cuda-11.5/lib64目录中确实没有libcudart.so.10.2这个文件&#xff0c;然后按照网上的教程&#xff0c;我在虚拟环境中安装了cuda10.2&#xff08;由于用…

mysql面试题九(SQL优化)

目录 1.一条 SQL 是如何执行的 2.索引失效的几种情况 3.EXPLAIN 4.Where 子句如何优化 5.超大分页或深度分页如何处理 6.大表查询如何优化 7.分库分表 基本概念 分库分表方法 水平拆分 垂直拆分 分库分表后的注意事项 1.一条 SQL 是如何执行的 在MySQL中&#xff0…

Windows自动化重启python脚本

博主遇到一个需求&#xff1a;每天都需要定时重启一个python脚本&#xff0c;这个脚本是跑在windows电脑上的&#xff0c;下面是博主的解决方法&#xff1a; 获取已经启动的应用的IDkill这个应用ID再次根据指定的Python环境运行这个脚本 文章目录 解决步骤1. 获取已经启动的应…

uni-app - 使用地图功能打包安卓apk的完美流程以及重要的注意事项(带您一次打包成功)

在移动应用开发中&#xff0c;地图功能是一个非常常见且实用的功能&#xff0c;可以帮助用户快速定位并浏览周边信息。而在uni-app开发中&#xff0c;使用地图功能也是一项必备技能。本文将介绍uni-app使用地图功能打包安卓apk的注意事项&#xff0c;帮助开发者顺利完成地图功能…

掼蛋跟牌技巧

掼蛋跟牌是指其他玩家领出牌&#xff0c;自己跟着出牌&#xff0c;在跟牌的时候&#xff0c;分为强牌和弱牌两种情况&#xff0c;一般强牌以顺牌为主&#xff0c;弱牌以顶牌为主。 一、上家领出牌 在游戏前期&#xff0c;上家领出牌的时候&#xff0c;应该尽量跟牌&#xff0c;…

Pulsar 2

文章目录 一、Pulsar高级组件基本使用1、Funcation(轻量级计算流程)概念与使用Function背景介绍什么是Functions如何使用 2、Pulsar Connector 连接器Pulsar Connector 连接器 ----> Pulsar Flink Connector 3、Transactions事务支持相关的操作Pulsar如何实现Exactly-OncePu…

2024年的Java版本选择?java 17 安装

文章目录 2024年的Java版本选择&#xff1f;java 1.8 和 java17 什么区别&#xff1f;java 17 安装windows 11安装java 17C:\Program Files\Common Files\Oracle\Java\javapath是什么 2024年的Java版本选择&#xff1f; 3年前&#xff0c;java 1.8是市场主流&#xff08;还有一…

BUU_RE

findit String m String.valueOf(x) valueOf()将不同类型数据转换为字符串 m.equals(edit.getText().toString()) edit.getText()通常用于从用户界面中获取文本输入&#xff0c;toString()方法将其转换为字符串&#xff0c;然后使用equals()方法进行比较 我改成了c代码&a…

乐观锁悲观锁

视频&#xff1a;什么是乐观锁&#xff1f;什么是悲观锁&#xff1f;_哔哩哔哩_bilibili