javaScript 深浅拷贝

javaScript深浅拷贝

在这里插入图片描述

浅拷贝

自己创建一个新的对象,来接受你要重新复制或引用的对象值。如果对象属性是基本的数据类型,复制的就是基本类型的值给新对象,但如果属性是引用数据类型,复制的就是内存中的地址,如果其中一个对象改变了这个内存中的地址,肯定会影响到另一个对象。

object.assign

object.assign是ES6中object 的一个方法该方法可以用于 JS 对象的合并等多个用途其中一个用途就是可以进行浅拷贝

object.assign 的语法为:0bject.assign(target,..sources)
let target = {}
let source = {a: {b: 1}}
Object.assign(target,source)
console.log(target)
source.a.b = 10
console.log(source)
console.log(target)

输出:

{ a: { b: 1 } }
{ a: { b: 10 } }
{ a: { b: 10 } }

object.assign 特性

  • 它不会拷贝对象的继承属性
  • 它不会拷贝对象的不可枚举的属性
  • 可以拷贝 Symbol类型的属性
let obj1 = {a: {b: 1}, sym: Symbol(1)}
Object.defineProperty(obj1,"innumerable",{value:'不可枚举类型',enumerable: false
})let obj2 = {}
Object.assign(obj2,obj1)
obj1.a.b = 2console.log("obj1",obj1)
console.log("obj2",obj2)

在这里插入图片描述

扩展运算符 …

/*对象的拷贝 */
let obj = {a: 1, b: {c: 1}}
let obj2 = {...obj}
obj.a = 2
console.log(obj) //{a:2,b:{c:1}} console.log(obj2); //{a:1,b:{c:1}}
obj.b.c = 2
console.log(obj) //{a:2,b:{c:2}} console.log(obj2); //{a:1,b:{c:2}}
/*数组的拷贝 */
let arr = [1, 2, 3]
let newArr = [...arr];//跟arr.slice()是一样的效果

输出

{ a: 2, b: { c: 1 } }
{ a: 2, b: { c: 2 } }

concat 拷贝数组

数组的 concat 方法其实也是浅拷贝

let arr = [1, 2, 3];
let newArr = arr.concat();
newArr[1] = 100
console.log(arr); // [ 1, 2, 3 ]
console.log(newArr);//[1, 100, 3 ]
[ 1, 2, 3 ]  
[ 1, 100, 3 ]

slice 拷贝数组

slice 方法仅仅针对数组类型

slice 的语法为:arr.slice(begin,end);
let arr = [1, 2, {val: 4}];
let newArr = arr.slice();
newArr[2].val = 1000;
console.log(arr);//[1,2,{val: 1000 }]

输出

[ 1, 2, { val: 1000 } ]

浅拷贝示例

const shallowClone = (target) => {if (typeof target === 'object' && target !== null) {const cloneTarget = Array.isArray(target) ? [] : {};for (let prop in target) {if (target.hasOwnProperty(prop)) {cloneTarget[prop] = target[prop]return cloneTarget;} else {return target}}}
}

浅拷贝总结

浅拷贝只是创建了一个新的对象,复制了原有对象的基本类型的值
对于复杂引用数据类型其在堆内存中完全开辟了一块内存地址并将原有的对象完全复制过来存放

深拷贝

将一个对象从内存中完整地拷贝出来一份给目标对象并从堆内存中开辟一个全新的空间存放新对象,且新对象的修改并不会改变原对象,二者实现真正的分离。

JSON.stringfy

在这里插入图片描述

let obj1 = {a: 1, b: [1, 2, 3]}
let str = JSON.stringify(obj1);
let obj2 = JSON.parse(str);
console.log(obj2); //{a:1,b:[1,2,3]}
obj1.a = 2;
obj1.b.push(4);
console.log(obj1); //{a:2,b:[1,2,3,4]}
console.log(obj2); //{a:1,b:[1,2,3]}

输出:

{ a: 1, b: [ 1, 2, 3 ] }   
{ a: 2, b: [ 1, 2, 3, 4 ] }
{ a: 1, b: [ 1, 2, 3 ] } 

JSON.stringfy 拷贝注意点

1.拷贝的对象的值中如果有函数、undefined、symbol这几种类型,经过JSON.stringify序列化之后的字符串中这个键值对会消失
2.拷贝 Date 引用类型会变成字符串
3.无法拷贝不可枚举的属性
4.无法拷贝对象的原型链
5.拷贝 RegExp 引用类型会变成空对象
6.对象中含有 NaN、Infinity 以及 -Infinity,JSON 序列化的结果会变成 null
7.无法拷贝对象的循环应用,即对象成环(obj[key]=obj)

function Obj() {this.func = function () {alert(1)};this.obj = {a: 1};this.arr = [1, 2, 3];this.und = undefined;this.reg = /123/;this.date = new Date(0);this.NaN = NaNthis.infinity = Infinity;this.sym = Symbol(1);
}let obj1 = new Obj();
Object.defineProperty(obj1, 'innumerable', {enumerable: false,value: "innumerable"
})
console.log('obj1', obj1)
let str = JSON.stringify(obj1);
let obj2 = JSON.parse(str);
console.log('obj2', obj2)
obj1 Obj {                       func: [Function (anonymous)],  obj: { a: 1 },                 arr: [ 1, 2, 3 ],              und: undefined,                reg: /123/,                    date: 1970-01-01T00:00:00.000Z,NaN: NaN,                      infinity: Infinity,            sym: Symbol(1)
}
obj2 {obj: { a: 1 },arr: [ 1, 2, 3 ],reg: {},date: '1970-01-01T00:00:00.000Z',NaN: null,infinity: null
}

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

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

相关文章

QML中表格中数据获取

1.在生成的动态表格中获取某格数据的内容 import QtQuick 2.15 import QtQuick.Window 2.15import QtQuick.Controls 2.0 import Qt.labs.qmlmodels 1.0 import QtQuick.Layouts 1.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")TableMod…

分类问题经典算法 | 二分类问题 | Logistic回归:公式推导

目录 一. Logistic回归的思想1. 分类任务思想2. Logistic回归思想 二. Logistic回归算法:线性可分推导 一. Logistic回归的思想 1. 分类任务思想 分类问题通常可以分为二分类,多分类任务;而对于不同的分类任务,训练的主要目标是…

Vue中<style scoped lang=“scss“>的含义

这段代码中的<style scoped lang"scss">是HTML和Vue框架结合使用时常见的一个模式&#xff0c;具体含义如下&#xff1a; scoped&#xff1a;这是一个Vue.js特有的属性&#xff0c;用来指定样式只应用于当前组件的元素。没有这个属性时&#xff0c;样式会全局应…

陈清将出席单螺杆蒸汽压缩机的应用与开发演讲

演讲嘉宾&#xff1a;陈清 首席科学家 康普莱斯压缩技术苏州有限公司 演讲题目&#xff1a;单螺杆蒸汽压缩机的应用与开发对节能减碳的意义-------超高温蒸汽压缩技术的突破 会议简介 “十四五”规划中提出&#xff0c;提高工业、能源领城智能化与信息化融合&#xff0c;明确…

博弈论,NIM游戏,台阶型,集合型,SG函数,详解

文章目录 一、Nim游戏1.1问题描述1.2定理1.2.1定理内容1.2.2定理证明 1.3OJ练习1.3.1模板OJ1.3.2P1247 取火柴游戏 二、台阶型Nim游戏2.1问题描述2.2结论及证明2.2.1结论2.2.2结论证明 2.3OJ练习2.3.1Georgia and Bob 三、有向图游戏&#xff0c;SG函数3.1定义3.1.1有向图游戏3…

【王道操作系统】ch1计算机系统概述-04操作系统结构

文章目录 【王道操作系统】ch1计算机系统概述-04操作系统结构操作系统的内核操作系统的体系结构考纲新增内容&#xff08;红色为全新内容&#xff0c;黄色为原有内容&#xff09;&#xff1a;01 分层结构02 模块化03 宏内核&#xff08;大内核&#xff09;和微内核04 外核 【王…

mybatisPlus中 Mapper层以及Service层的方法 整理分类 以及代码实操

MyBatis-Plus是一个基于MyBatis的增强工具&#xff0c;旨在简化开发、提高效率。它提供了通用的mapper和service&#xff0c;可以在不编写任何SQL语句的情况下&#xff0c;快速实现对单表的CRUD、批量、逻辑删除、分页等操作。 功能代码测试前提&#xff1a; 需要对mybatisPl…

HarmonyOS Full SDK的安装

OpenHarmony的应用开发工具HUAWEI DevEco Studio现在随着OpenHarmony版本发布而发布,只能在版本发布说明中下载,例如最新版本的OpenHarmony 4.0 Release。对应的需要下载DevEco Studio 4.0 Release,如下图。 图片 下载Full SDK主要有两种方式,一种是通过DevEco Studio下载…

黑马程序员微信小程序学习总结11.分包与uniapp

这里写目录标题 分包什么是分包分包加载规则 自定义tab&#xff08;略&#xff0c;后面项目使用到再学&#xff09;uniapp创建项目目录结构使用git管理项目新建页面配置tabbar修改导航栏 分包 什么是分包 分包加载规则 其他略&#xff0c;赶进度快进到uniapp&#xff0c;这些可…

黑马c++ STL部分 笔记(5) stack容器

stack是一种先进后出的数据结构&#xff0c;它只有一个出口。 栈中只有栈顶的元素才可以被外界使用&#xff0c;因此栈不允许有遍历行为。 栈可以判断容器是否为空。 栈可以返回元素个数。 栈中进入数据——入栈push。 栈中弹出数据——出栈pop。 stack常用接口 // stack常用…

2023年06月CCF-GESP编程能力等级认证Scratch图形化编程四级真题解析

一、单选题(共15题,共30分) 第1题 高级语言编写的程序需要经过以下( )操作,可以生成在计算机上运行的可执行代码。 A:编辑 B:保存 C:调试 D:编译 答案:D 第2题 排序算法是稳定的(Stable Sorting),就是指排序算法可以保证,在待排序数据中有两个相等记录的关…

堆与TopK问题分析

TopK问题 题目及思路分析 所谓TopK问题&#xff0c;在一组数据中找出前K个最大或者最小的数值&#xff0c;而使用TopK问题的解决思路的问题一般数据个数都比较大&#xff0c;如果直接用数组&#xff0c;则会导致数据无法一次性加载到内存从而难以比较&#xff0c;难者甚至因为…