【ES6】—【必备知识】—深拷贝与浅拷贝

一、如何把一个对象复制给另一个对象

1.Object.assign()

let target = {}
let source = {a: 1,b: 2
}
Object.assign(target,source)
console.log(target)
// {a: 1, b: 2}

2.Object.assign() 只能实现浅拷贝

let target = {a: {b:1,c: 8}
}
let source = {a: {b:2}
}
Object.assign(target,source)
console.log(target)
/*
{"a": {"b": 2}
}	
*/
// c 合并时丢失了

PS: 当两个对象其中一个对象,有两层或以上的结构时,Object.assign() 复制合并是有缺陷

二、深拷贝与浅拷贝

1. 浅拷贝:A对象拷贝了B对象的引用地址,两者最终指向同一块内存空间,所以任意对象值发生改变,都会改变内存空间的值

生活例子:我使用支付宝绑定了银行卡A,这时候给老婆的支付宝开通亲情卡绑定了银行卡A,
两个对象指的银行卡和亲情卡,不用的引用地址指的两个支付宝账号绑定渠道,最终指向银行卡A里面的钱,当我或老婆每次花一笔钱,银行卡A里面值都会发生改变。

生活例子:在线共享execl表格,每次拷贝就是复制URL,打开线上execl表格,每个人修改保存,都会同步更新给其他人。

let obj1 = {name: 'xiao'
}
let obj2 = obj1
console.log(obj1)
// {name: 'xiao'}
obj1.name = 'guo'
console.log(obj2)
// {name: 'guo'}

2. 深拷贝: A对象拷贝了B对象的值,创造了新的内存空间,两者的值改变时互不影响

PS: 当前对象 指的 基本数据类型 和 对象

let a = 5
let b = a
a = 6
console.log(a, b)

三、 如何实现深拷贝

1. 通过对象和字符串之间的转换实现深拷贝

  1. JSON.parse() 把json字符串 转换为 json对象
  2. JSON.stringify() 把json对象转换json字符串
let obj1 = {name: '张三'}
// 转换为json字符串
let str = JSON.stringify(obj1)
let obj2 = JSON.parse(str)
obj1.name = '赵四'
console.log(obj2)
// {name: '张三'}

2. 自定义深拷贝函数

// 检测数据类型
let checkType = data => {let type = Object.prototype.toString.call(data)// 从索引8开始截取,一直到结束type = type.slice(8, -1)return type
}// 深拷贝
let deepClone = target => {let targetType = checkType(target)let resultif (targetType === 'Object') {result = {}} else if (targetType === 'Array') {result = []} else {return target}for(let i in target) {let value = target[i]let valueType = checkType(value)if (valueType === 'Object' || valueType === 'Array') {result[i] = deepClone(value) // 递归	} else {result[i] = value}}return result
}
// 数组测试
let arr1 = [1, 2, {age:18}]
let arr2 = deepClone(arr1)
arr2[2].age= 34
console.log(arr1)
/*
[1,2,{"age": 18}
]
*/
// 对象测试
let obj1 = {name: 'xiaoxiao',hobby: ['游戏', '羽毛球']
}
let obj2 = deepClone(obj1)
obj2.hobby[0] = '睡觉'
console.log(obj1)
/*
{"name": "xiaoxiao","hobby": ["游戏","羽毛球"]
}
*/
console.log(obj2)
/*
{"name": "xiaoxiao","hobby": ["睡觉","羽毛球"]
}
*/

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

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

相关文章

无涯教程-PHP - File 函数

文件系统功能用于访问和操纵文件系统&#xff0c;PHP为您提供了操纵文件的所有功能。 运行时配置 这些功能的行为受php.ini中的设置影响。 NameDefaultChangeableChangelogallow_url_fopen"1"PHP_INI_ALLPHP_INI_ALL in PHP < 4.3.4. PHP_INI_SYSTEM in PHP &l…

Linux:如何创建用户

“useradd” 命令用于在 Linux 或类 Unix 系统上创建新用户账户。它是一个需要超级用户权限的命令&#xff0c;因此你需要以 root 或具有 sudo 权限的用户身份运行它。下面是使用 “useradd” 命令创建新用户的基本语法&#xff1a; useradd [选项] 用户名 下面是一些常用选项…

windows上ffmpeg如何录制双屏幕中的一个屏幕上的视频

首先&#xff0c;如何在window上安装ffmpeg自己查找scoop安装ffmpeg. 如题&#xff1a; 如果你有两个屏幕&#xff0c;如何让ffmpeg来录制其中的一个屏幕的视频呢。 很简单&#xff0c;首先你要查看另外一个屏幕的分辨率&#xff1a; 第一步&#xff1a;进入系统中 第二步&am…

硬件产品的量产问题------硬件工程师在产线关注什么

前言&#xff1a; 产品开发测试无误&#xff0c;但量产缺遇到很多不良甚至DOA问题。 硬件开发过程中如何确保产线的治具、生产及硬件工程师在产线需要关注一些什么。 坚信&#xff1a;好的产品是要可以做出来的。 1、禁忌&#xff1a; 禁忌热插拔&#xff1b;禁忌测试不防呆…

Python Opencv实践 - 图像直方图均衡化

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) print(img.shape)#图像直方图计算 #cv.calcHist(images, channels, mask, histSize, ranges, hist, accumulate) #images&…

link 和 @import 有什么区别

页面导入样式时&#xff0c;使用 link 和 import 有什么区别 HTML中使用 link 标签 <link rel"stylesheet" href"style.css" />CSS 中 import import "style.css"; import url("style.css"); /* 两种方式无差别 */两者的区别…

数学建模知识之小白入门篇

数学建模知识--小白入门篇 一、数学模型的定义二、建立数学模型的方法和步骤1. 模型准备2. 模型假设3. 模型构成4. 模型求解5. 模型分析 三、数模竞赛出题的指导思想四、竞赛中的常见题型1. 实际问题背景2&#xff0e;若干假设条件3&#xff0e;要求回答的问题 五、提交一篇论文…

ModStartBlog v8.0.0 博客归档页面,部分组件升级

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场&#xff0c;后台一键快速安装会…

C语言入门 Day_9 条件判断

目录 前言&#xff1a; 1.if判断 2.else判断 3.易错点 4.思维导图 前言&#xff1a; 我们知道比较运算和逻辑运算都会得到一个布尔型的数据&#xff0c;要么为真&#xff08;true&#xff09;&#xff0c;要么为假&#xff08;false&#xff09;。 今天我们来学习真和假在…

面试热题(复原ip地址)

有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址&#xff0c;但是 "0.011.255.24…

pyqt5-自定义停靠栏头部

import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import *class CustomDock(QDockWidget):def __init__(self, title: str, parentNone):super().__init__(title, parent)"""停靠栏的头部"""h_layout Q…

行式存储与列式存储

1.概述 数据处理大致可分为两大类&#xff0c;联机事务处理OLTP(on-line transaction processing) 和联机分析处理OLAP(on-line analytical processing)。 OLTP是传统关系型数据库的主要应用&#xff0c;用来执行一些基本的、日常的事务处理&#xff0c;比如数据库记录的增、删…

android NullPointerException externalCacheDir

先看代码&#xff1a; fun Context.getMyCacheDir(): String {return externalCacheDir!!.absolutePath "/my_cache" }如上代码&#xff0c;在某些手机可能会出现crash。 原因详细阅读api&#xff0c;注意他有一个大大的注解Nullable&#xff1a; Nullablepublic a…

uniapp微信小程序点击右上角菜单分享功能权限配置

个人项目地址&#xff1a; SubTopH前端开发个人站 &#xff08;自己开发的前端功能和UI组件&#xff0c;一些有趣的小功能&#xff0c;感兴趣的伙伴可以访问&#xff0c;欢迎提出更好的想法&#xff0c;私信沟通&#xff0c;网站属于静态页面&#xff09; SubTopH前端开发个人站…

solidity0.8.0的应用案例7:线性释放合约

在传统金融领域,一些公司会向员工和管理层提供股权。但大量股权同时释放会在短期产生抛售压力,拖累股价。因此,公司通常会引入一个归属期来延迟承诺资产的所有权。 同样的,在区块链领域,Web3初创公司会给团队分配代币,同时也会将代币低价出售给风投和私募。如果他们把这…

threejs贴图系列(一)canvas贴图

threejs不仅支持各种texture的导入生成贴图&#xff0c;还可以利用canvas绘制图片作为贴图。这就用到了CanvasTexture&#xff0c;它接受一个canas对象。只要我们绘制好canvas&#xff0c;就可以作为贴图了。这里我们利用一张图片来实现这个效果。 基础代码&#xff1a; impo…

开始MySQL探索——数据库概述

计算机语言 计算机语言概述 计算机语言&#xff08;Computer Language&#xff09;可以简单的理解为一种计算机和人都能识别的语言。 机器语言 汇编语言 高级语言 机器语言 汇编语言 高级语言 SQL语言基础 SQL的概述 SQL全称&#xff1a;Structured Query Language&…

无涯教程-PHP - preg_match()函数

preg_match() - 语法 int preg_match (string pattern, string string [, array pattern_array], [, int $flags [, int $offset]]]); preg_match()函数在字符串中搜索pattern&#xff0c;如果存在pattern&#xff0c;则返回true&#xff0c;否则返回false。 如果提供了可选…

介绍一些编程语言— CSS 语言

介绍一些编程语言— CSS 语言 CSS 语言 简介 CSS&#xff0c;层叠样式表&#xff0c;是一种用来表现 HTML 或 XML 等文件样式的计算机语言。CSS 不仅可以静态地修饰网页&#xff0c;还可以配合各种脚本语言动态地对网页各元素进行格式化。 CSS 能够对网页中元素位置的排版进…

Docker Compose一键管理容器

可以一键批量管理docker的容器。将所有需要创建的容器定义在compose配置文件中&#xff0c;通过一个命令一键可以创建并运行这些容器&#xff0c;而不需要一个一个启动。可以批量启动停止服务。 安装 #安装Docker-Compose并安装到/usr/local/bin/docker-compose curl -L &quo…