浅拷贝

article/2025/10/12 1:33:30

图片转自js 深拷贝 vs 浅拷贝
在这里插入图片描述
我们平常说的深拷贝和浅拷贝都是基于对诸如 ObjectArray 等引用数据类型的拷贝。对于基本数据而言,拷贝为某个值的赋值。
在说拷贝之前,我们先复习一下什么是基本数据类型和引用类型。

基本数据类型

JavaScript 中基本数据类型有五类——String、Number、Boolean、null、undefined,它们的值存放在了内存中的栈中,也就是我们说的栈内存。它们是存放在栈内存中的简单数据段,数据大小确定,内存空间大小可以分配,可以直接访问。

基本数据类型的值是不可变的。那这里会有人要问?可以改变啊!我们可以给它赋值啊。但是这里需要注意的是,对一个变量的重新赋值,并没有改变基本数据类型的值。它们的赋值操作是在内存中新开辟一段栈内存,然后再将值赋值到新的栈中去——我们可以称其为传值。

var a = 10;
var b = a;a ++ ;
console.log(a); // 11
console.log(b); // 10

引用数据类型
而在 JavaScript 中还有一种数据类型就是引用数据类型,也叫复杂数据类型。比如 Object、Array、Function等,其实我们可以理解为 Object。它们的值存放是这样的:在栈内存中存放变量以及指向堆内存中存储位置的指针(说简单点,变量实际上是一个存放在栈内存中的指针),值存放在堆内存中。值是可以动态改变的。

引用类型是可以直接改变其值的:

var a = [1,2,3];
a[1] = 5;
console.log(a[1]);  // 5

引用类型的比较实则是引用(指针)的比较,也就是看其引用是否指向同一个对象。

var a = { tt: 1 };
var b = { tt: 1 };console.log(a === b);   // false

虽然他俩的内容都是 { tt: 1 },但是它们在内存中的位置是不一样的,指向的不是同一个对象,所以不相等。

引用类型的赋值相对而言,不是简单的值的传递,而是引用的传递,可以理解为传址。也就是说引用类型的赋值其实就是对象保存在栈内存中地址的赋值,这样就可以将两个变量都指向一个对象,此时两者之间的操作相互之间都是有影响的。

var a = {}; // a保存了一个空对象的实例
var b = a;  // a和b都指向了这个空对象a.name = 'jozo';
console.log(a.name); // 'jozo'
console.log(b.name); // 'jozo'b.age = 22;
console.log(b.age);// 22
console.log(a.age);// 22console.log(a == b);// true

浅拷贝

那么经常会有人说赋值也是浅拷贝,其实这种说法是不严谨的,因为赋值本质上只是同一个引用,并不是真正的浅拷贝。
浅拷贝只复制一层对象的属性,并不会进行递归复制,而在浅拷贝之后,源对象与目标对象的引用已经不是同一块内存空间。
JavaScript 存储对象都是存储地址的,浅拷贝导致更深一层的对象可能会指向同一个内存地址。

var obj = { a: 1, arr: [1,2,3] }
var copyObj = shallowCopy(obj);function shallowCopy(obj) {var copy = {}for (var key in obj) {if (obj.hasOwnProperty(key)) {copy[key] = obj[key]}}return copy;
}

在这里插入图片描述
这样会导致如果改变其中某个对象的 arr 属性,那另一个对象的也会被改变:

obj.arr[0] = 3;
copyObj.arr[0]; // 3

实现浅拷贝的主要方法有:

  1. 循环遍历——看上面 shallowCopy 函数;
  2. ES6 Object.assign()
  • Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象分配到目标对象。它将返回目标对象。
  • 拷贝的是对象的属性的引用,而不是对象本身。
  • 源码实现:
if (typeof Object.assign !== 'function') {Object.defineProperty(Object, 'assign', {value: function assign(target, varArgs) {'use strict';if (target === null || target === undefined) {throw new TypeError('Cannot convert undefined or null to object');}var to = Object(target);for (var index = 1; index < arguments.length; index++) {var nextSource = arguments[index];if (nextSource !== null && nextSource !== undefined) {for (var key in nextSource) {if (Object.prototype.hasOwnProperty.call(nextSource, key)) {to[key] = nextSource[key]}}}}return to;},writable: true,configurable: true,})
}
  1. ES6 扩展运算符
let obj2 = {...obj1};
  1. Array.from()
 let arr1 = [1, 2, 3, 4]let arr2 = Array.from(arr1);
  1. arr.slice()
let arr1 = [1, 2, 3, 4]
let arr2 = arr1.slice();
  1. concat 浅拷贝数组
let arr = [1,2,3];
let newArr = arr.concat();
newArr[0] = 100;
console.log(arr); // 1,2,3

http://chatgpt.dhexx.cn/article/LVk4I6yr.shtml

相关文章

深浅拷贝以及解决浅拷贝(以string浅拷贝为例)

一、什么是浅拷贝 在类和对象的时候&#xff0c;其中编译器生成的默认拷贝构造函数中&#xff0c;内置类型是按照字节方式直接拷贝的&#xff0c;而自定义类型是调用其拷贝构造函数完成拷贝的。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝&#xff0c;这种拷贝叫做浅…

ctf之培根密码

根据特征怀疑是培根密码 flag{AAAABAAAAAAAABAABBBAABBABABAAABAABAAAABBAABAAABABBABAAAAAABAABAAAABBBABABAABAABA} 直接在线解密 https://tool.bugku.com/peigen/ flag{BACONISDELICIOUS}

培根密码加解密

分享一下我老师大神的人工智能教程&#xff01;零基础&#xff0c;通俗易懂&#xff01;http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章。分享知识&#xff0c;造福人民&#xff0c;实现我们中华民族伟大复兴&#xff01; 0x00 介绍 培根密码实际上就是一种替换密…

培根密码解密脚本

官方吐槽&#xff1a;疫情复发难受&#xff0c;什么时候是个头 #!/usr/bin/env python3 # -*- coding:utf-8 -*- #Author&#xff1a;later_future import string miweninput("请输入密文&#xff1a;") count0 msg"" flag"" #培根加密百度百科…

攻防世界crypto部分sherlock的writeup,原来不是培根密码。

下载附件后&#xff0c;发现是一个很大的文本&#xff0c;搜了下flag没啥收获。 1、后来看到下面这个 2、明显的故意大写&#xff0c;难道是培根密码&#xff1f;这就有思路了&#xff0c;将大写过滤出来&#xff1a; cat f590c0f99c014b01a5ab8b611b46c57c.txt | grep -Eo […

培根密码加解密(Python)

原理 加密时&#xff0c;明文中的每个字母会根据下面转换成5个字母&#xff1b; 解密时&#xff0c;密文中的每5个字母为一组转换成对应的1个字母&#xff1b; Python代码如下&#xff1a; CODE_TABLE { #培根字典aaaaa:a,aaaab:b,aaaba:c,aaabb:d,aabaa:e,aabab:f,aabba:…

CTF密码学-加解密总结

零基础学黑客&#xff0c;搜索公众号&#xff1a;白帽子左一密码学基本简介 密码学&#xff08;在西欧语文中&#xff0c;源于希腊语krypts“隐藏的”&#xff0c;和grphein“书写”&#xff09;是研究如何隐密地传递信息的学科。 在现代特别指对信息以及其传输的数学性研究&…

密码及编码

1. 密码 古典密码学 凯撒密码(Caeser)&#xff1a;位移密码 特殊形式&#xff08;加解密相同&#xff0c;因为26个字母是循环的&#xff09;&#xff1a;ROT13 栅栏密码&#xff1a;分组密码。 弗吉尼亚 现代密码学 对称加密算法&#xff1a;使用加密用过的秘钥及相同算法的…

CTF-密码学-培根密码

题目&#xff1a;bacon bAcon iS a MEaT prodUcT prePared frOm a pig and UsuALLy cUReD. 读题&#xff1a;翻译过来意思是培根 审题&#xff1a;联想到培根密码 解题&#xff1a;培根密码就是大写变A小写变B import string timu"bAcon iS a MEaT prodUcT prePared frOm…

【无标题】简单的培根密码解密

第一题 题目AABBBAABAAABABAABABAABBAB BABAAABBABBAAAAAAABB 此题由大写字母AB组成&#xff0c;不难看出这可以用培根密码转换器进行解密得出flag 解密得出flag&#xff5b;HELLO WORD&#xff5d;

CTF-Show密码学【摩斯码、培根密码】

萌新 密码33 一、题目信息 题目名称&#xff1a;我想吃培根题目描述&#xff1a;-- — .-. … . …–.- … … …–.- -.-. — — .-… …–.- -… …- - …–.- -… .- -.-. — -. …–.- … … …–.- -.-. — — .-… . .-. …–.- – – -… -… – -… – -… – – – -…

CTF-培根密码

CTF学习上的一些疑点和解疑 主题&#xff1a;培根密码的随意性 反正我是觉得挺离谱的 序章 CTF学习上的一些疑点和解疑前言&#xff1a;培根小贴士一、培根密码是什么&#xff1f;二、解答1.题目2.解密顺序 总结还没听懂的我给大家展现一些例子&#xff1a; 前言&#xff1a;…

密码学笔记——培根密码

培根密码,培根所用的密码是一种本质上用二进制数设计的,没有用通常的0和1来表示,而是采用a和b 一、培根密码加密方式 第一种方式: A aaaaa B aaaab C aaaba D aaabb E aabaa F aabab G aabba H aabbb I abaaa J abaab K ababa L ababb M abbaa N abbab O abbba P abb…

培根密码(Bacon)——python解密

简介 培根密码&#xff0c;又名倍康尼密码&#xff08;英语&#xff1a;Bacon’s cipher&#xff09;是由法兰西斯培根发明的一种隐写术。 特点&#xff1a; 培根密码本质上是将二进制信息通过样式的区别&#xff0c;加在了正常书写之上。培根密码所包含的信息可以和用于承载…

CTF-bacon(培根密码)

一、题目 培根密码实际上就是一种替换密码&#xff0c;根据所给表一一对应转换即可加密解密 。它的特殊之处在于&#xff1a;可以通过不明显的特征来隐藏密码信息&#xff0c;比如大小写、正斜体等&#xff0c;只要两个不同的属性&#xff0c;密码即可隐藏。 二、解题思路 …

【密码学 | CTF】培根密码

原理简述 加密方式有两种&#xff0c;但说实话我没看懂第二种的&#xff1b;i-j和u-v是怎么加密的呢&#xff1f;一解密岂不是乱了&#xff1f; 但解密用第一种方式就行了&#xff0c;每五个切割&#xff0c;对照字典解密即可&#xff0c;难度很小 def 培根密码_解密():培根密…

XML文档操作

文章目录 [toc] XML概述代码示例 CSS格式化XML为什么要用CSS样式表&#xff1a; 代码示例&#xff1a;代码详解&#xff1a; XSLT转化XMLXSLT简介&#xff1a;代码示例代码详解&#xff1a;正确的样式表声明从XML里提取数据节点匹配 DOM解析XMLXML DOM简介节点 代码示例代码详解…

XML文件的DOCTYPE定义

2019独角兽企业重金招聘Python工程师标准>>> DOCTYPE的常用声明&#xff1a;按照 HTML 4.01 XHTML 1.0 XHTML 1.1 列表如下&#xff0c;错误的DOCTYPE HTML PUBLIC反而会导致页面解析错误。HTML 4.01规范分为&#xff1a;Strict, Transitional, Frameset <!DO…

XML的内容

XML简介&#xff1a; XML是跨平台的语言&#xff0c;它不需要安装任何环境的语言&#xff0c; 它是所有语言所共有的&#xff0c;单独的语言&#xff0c;并且不是所有语言内部的。 它是让所有语言去和xml交互 。 注意&#xff1a; html前身是xml <></>&#xff0…

xml的介绍、xml的示例文件、xml语法介绍

xml的介绍 xml是可扩展的标记性语言 xml的主要作用&#xff1a; 1.用来保存数据&#xff0c;而且这些数据具有自我描述性 2.它可以作为项目或者模块的配置文件 3.还可以做网络传输的格式(现在以JSON为主) xml的示例文件 先创建一个文件 文件命名为xxx.xml 在xml文件中书写内…