JS005. 拷贝引用数据类型Array使其指向不同堆的解决方案
一个很常见的语法问题,但专注实现需求时经常会忘记去避免,导致最终问题的出现,再花时间排查。为此专门整理一篇解决方法的博客,也加强一下自己的记忆。
TAG: JSON.parse() JSON.stringify() Array.prototype.concat() 扩展运算符 Object.assign()
案例复现
左右变量皆为数组的等式,它们所指向的堆栈也会相同。
let arrA = [1, 2, 3] let arrB = arrA
arrA.pop() console.log(arrB)
// [1, 2]
问题原因
JS中array是引用类型,也就是arrA和arrB的原数据存储地址是一样的,arrA和arrB都是对原数据的引用,所以修改其中一个,另一个也会改变。
就好像是一个房间有两扇门,AB两人分别从不同的门进去所到达的房间是一样的,此时A拿走一个苹果,B会看到房间里少了一个苹果;B从外面带了一瓶饮料回到房间,A也会看到这个房间多了一瓶饮料。
解决方案
- ES6 - Object.assign( )
Object.assign( )方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。它的第一个参数是目标对象,后面的参数都是源对象。
let arrA = [1, 2, 3]
let arrB = Object.assign([], arrA) arrA = null
console.log(arrB)
// [1, 2, 3]
- ES6 - 扩展运算符
对象中的扩展运算符(...)用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中,数组同理。
let arrA = [1, 2, 3]
let arrB = [...arrA] arrA.pop()
console.log(arrB)
// [1, 2]
- Array对象 - concat( )
concat() 方法用于连接两个或多个数组。该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
let arrA = [1, 2, 3]
let arrB = [].concat(arrA) arrA.shift()
console.log(arrA, arrB)
// [2, 3][1, 2, 3]
- JavaScript JSON - JSON.stringify( ) & JSON.parse( )
JSON.stringify( ) 方法用于将 JavaScript 值转换为 JSON 字符串。
JSON.parse( ) 方法用于将一个 JSON 字符串转换为对象。
let arrA = []
let arrB = JSON.parse(JSON.stringify(arrA)) arrA.push(1)
console.log(arrA, arrB)
// [1][]
我的其他相关文章:
ES6:使用解构赋值仅用一行定义多个相同的数组,且指向堆不同(解构赋值)
- END -
JS005. 拷贝引用数据类型Array使其指向不同堆的解决方案的更多相关文章
- JS基本数据类型和引用数据类型的区别及深浅拷贝
前言 首先我们先来了解一下什么叫栈堆,基本数据类型与引用数据类型 1.栈(stack)和堆(heap)stack为自动分配的内存空间,它由系统自动释放:而heap则是动态分配的内存,大小也不一定会自动 ...
- Object 对象(对象的分类、属性(属性名和属性值)、基本数据类型与引用数据类型区别)
Object——引用数据类型 基本数据类型的不足之处:基本数据类型是单一的值,不能表现出值与值之间的所属关系 object分为内建对象.宿主对象和自定义对象 a 内建对象:ES标准中定义的对象,在任何 ...
- [19/05/28-星期二] JavaScript_ 对象和引用数据类型
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- js数组和对象相等判断、拷贝详解(结合几个现象讲解引用数据类型的趣事)
序言 最近遇到几个js引用数据类型造成的bug,今天结合bug详细分析一下,避免以后再犯,也希望能帮大家提个醒,强化js基本功. 目录 1.浅拷贝.深拷贝,解决变量赋值相互影响问题 2.判断2个数组. ...
- java基础-引用数据类型之一维数组(Array)
java基础-引用数据类型之一维数组(Array) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组的定义 1>.为什么需要数组 保存一个数据可以定义一个变量,如果要保 ...
- java基础-引用数据类型之二维数组(Array)
java基础-引用数据类型之二维数组(Array) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我们学习过了Java的一维数组,所谓的二维数组就是元素是一堆一维数组的数组,换 ...
- (vue.js)vue中引用了别的组件 ,如何使this指向Vue对象
Vue中引用了别的组件 ,如何使this指向Vue对象 今天学习Vue组件传值, 通过创建Vue实例, 广播和监听实现传值, 但是传值之后无法直接将得到的值应用到Vue对象, 因为这相当于引用改了别的 ...
- JS 基本数据类型和引用数据类型
本文章已收录于: .embody { padding: 10px 10px 10px; margin: 0 -20px; border-bottom: solid 1px #ededed } .e ...
- JavaScript中基本数据类型和引用数据类型的区别
1.基本数据类型和引用数据类型 ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型. 基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构成的对象. 当我们把变量赋值给一个变 ...
随机推荐
- kubernetes/k8s CRI分析-kubelet创建pod分析
先来简单回顾上一篇博客<kubernetes/k8s CRI 分析-容器运行时接口分析>的内容. 上篇博文先对 CRI 做了介绍,然后对 kubelet CRI 相关源码包括 kubele ...
- Prometheus MySQL监控+grafana展示
前言 最近爱上了研究各种杂七杂八的技术. Prometheus是现如今最火的监控软件之一.做为一个运维DBA,不会这个可就OUT了. 本篇博客,演示一下prometheus之通过mysql expor ...
- DVWA靶场练习-暴力破解
一.暴力破解 (Brute Force) 暴力破解是Web安全领域的一个基础技能,破解方法论为:构建常见用户名及弱口令 因此需要好的字典,对应破解场景构建特定的用户名密码,以及还需要具有灵活编写 ...
- 3个月零基础入门Python+数据分析,详细时间表+计划表分享
大家好,我是白云. 今天想给大家分享的是三个月零基础入门数据分析学习计划.有小伙伴可能会说,英语好像有点不太好,要怎么办?所以今天我给大家分享的资源呢就是对国内的小伙伴很友好,还附赠大家一份三个月学 ...
- Java数组06——冒泡排序
冒泡排序 例子: package array; import java.util.Arrays; public class ArrayDemon08 { public static ...
- 使用Eclipse下载CRaSH源代码
Eclipse for Java Developers (Juno)本身有一个eGit组件,通过它可以直接从Git源码库中下载源代码,以下载 CRaSH 为例说明: 从主页上的"Develo ...
- Java基础技术基础面试【笔记】
Java基础技术基础面试[笔记] String.StringBuilder以及StringBuffer三者之间的区别? 三者的区别可以从可变性,线程安全性,性能这三个部分进行说明 可变性 从可变性来说 ...
- Python 应用爬虫下载酷狗音乐
应用爬虫下载酷狗音乐 首先我们需要进入到这个界面 想要爬取这些歌曲链接,然而这个是一个假的网站,虽然单机右键进行检查能看到这些歌曲的链接,可进行爬取时,却爬取不到这些信息. 这个时候我们就应该换一种思 ...
- 构建工具之Maven的使用(一)
一.前言 对于开发一个Java项目,上线之前会通过编译,测试,打包,部署这几个构建过程,如果文件较少,我们可以使用java-->javac-->jar这些命令去完成上述的构建流程.但是当工 ...
- uniapp 实现信息推送(App)
废话不多说直接上代码 以下代码需写在onlaunch生命周期内 onlaunch(){// onlaunch应用级生命周期 :当uni-app 初始化完成时触发(全局只触发一次) //#ifdef A ...