Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >js数组的拷贝赋值复制-你真的懂?

js数组的拷贝赋值复制-你真的懂?

作者头像
IT架构圈
发布于 2018-05-31 08:04:16
发布于 2018-05-31 08:04:16
4.9K00
代码可运行
举报
文章被收录于专栏:IT架构圈IT架构圈
运行总次数:0
代码可运行

在看react-native性能优化的时候,看到如何避免shouldComponentUpdate的异常数据时,脑内一阵风暴,从而牵连出一连串的问题,于是有了这一篇关于js数组的复制(深浅拷贝)与赋值等为何能产生异常数据的文章。 有什么问题欢迎指正

现在进入正题: 首先异常数据的产生在于我们在复制赋值时,会有或没有改变到本身的值。

一、push与concat

push的定义是:像数组末尾添加一个或更多元素,并返回新的长度。该方法会改变数组的长度。 concat的定义是:连接两个或更多的数组,并返回结果,该方法不会改变现有数组,而仅仅会返回数组的一个副本。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    var a = [1,2];  
    a.push([3,4]);  
    a.concat(5);  
    //a为1 2 3,4 5  

二、深拷贝与浅拷贝

1.浅拷贝

JavaScript存储对象都是存地址的,所以浅复制会导致 a 和 b 指向同一块内存地址

数组的赋值其实相当于给了索引,改变其中一个变量其他引用都会改变

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var a = [1,2,3];  
var b = a;  
b[0] = 4;  
//a为4 2 3  
//b为4 2 3  

根据上面存储对象的问题,这里就可以解决另一个问题: 原始参数(比如一个具体的数字)被作为值传递给函数;值被传递给函数,如果被调用函数改变了这个参数的值,这样的改变不会影响到全局或调用函数。 你传递一个对象(在js里数组不是简单数据类型,而是对象)到一个函数,如果在函数里面改变了这个参数的内容,在外部这个变化是可见的。

2.深拷贝

(1)slice 函数 (2)concat 函数 (3)assgin

三个函数的原理都是返回数组的一个副本(相当于另外开辟内存空间),所以并不会改变数组本身的的值 但是这里有一点不同,就是assgin与其他两点的不同虽然说assgin也是深拷贝,但是他只是第一层深拷贝,第二层之后还是进行浅拷贝,例子如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var a = {  
    a1:{  
        aa1:'11',  
        aa2:'22'  
    }  
}  
var b = Object.assgin({},a);  
var c = Object.assgin({},a);  
b.a1.aa1 = 33;  
/*  
b:{  
    a1:{  
        aa1:'33',  
        aa2:'22'  
    }  
}  
c:{  
    a1:{  
        aa1:'33',  
        aa2:'22'  
    }  
}  
*/  
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程坑太多 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JS 数组、对象的深拷贝
以上是简单数组、对象的深拷贝方法,但是对于二维数组、对象数组、对象里包含对象,以上方法均达不到深拷贝方法
Krry
2019/04/23
8.4K0
JavaScript之深拷贝和浅拷贝
工作中会经常遇到操作数组、对象的情况,你肯定会将原数组、对象进行‘备份’ 当真正对其操作时发现备份的也发生改变,此时你一脸懵逼,到时是为啥,不是已经备份了么,怎么备份的数组、对象也会发生变化。 如果你对拷贝原理理解的不透彻,此文或许能提供一点帮助。
Jack Chen
2018/12/13
5220
JavaScript之深拷贝和浅拷贝
前端的浅拷贝和深拷贝区别_解构赋值是深拷贝还是浅拷贝
对于浅拷贝来说,比如一个数组(数组是一种对象),只要我们修改了一个拷贝数组,那么原数组也会改变!
全栈程序员站长
2022/11/14
4930
前端的浅拷贝和深拷贝区别_解构赋值是深拷贝还是浅拷贝
day035: JS中浅拷贝的手段有哪些?
这是直接赋值的情况,不涉及任何拷贝。当改变newArr的时候,由于是同一个引用,arr指向的值也跟着改变。
用户3806669
2021/03/11
8420
js对象的直接赋值、浅拷贝与深拷贝
最近Vue项目中写到一个业务,就是需要把对话框的表单中的数据,每次点击提交之后,就存进一个el-table表格中,待多次需要的表单数据都提交进表格之后,再将这个表格提交,实现多个表单数据的同时提交,期间还可以用表格进行预览、修改等其他操作。将每个表单数据存进表格的代码大致代码如下:
OwenZhang
2021/12/08
4.4K0
js对象的直接赋值、浅拷贝与深拷贝
前端开发知识汇总--JS
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/j_bleach/article/details/67642677
j_bleach
2019/07/02
1.3K0
一文搞懂JS中的赋值·浅拷贝·深拷贝
为什么写拷贝这篇文章?同事有一天提到了拷贝,他说赋值就是一种浅拷贝方式,另一个同事说赋值和浅拷贝并不相同。我也有些疑惑,于是我去MDN搜一下拷贝相关内容,发现并没有关于拷贝的实质概念,没有办法只能通过实践了,同时去看一些前辈们的文章总结了这篇关于拷贝的内容,本文也属于公众号【程序员成长指北】学习路线中【JS必知必会】内容。
coder_koala
2019/07/30
3.2K0
一文搞懂JS中的赋值·浅拷贝·深拷贝
理解JS的深浅拷贝以及深度拷贝解决双向绑定的问题
浅度拷贝保存了一个指向该对象的指针,所有的操作都是对该引用的操作,所以对对象的修改会影响其他的复制对象。
前端迷
2018/12/06
7550
搞不懂JS中赋值·浅拷贝·深拷贝的请看这里
百科定义:拷贝就是拷贝指向对象的指针,意思就是说:拷贝出来的目标对象的指针和源对象的指针指向的内存空间是同一块空间,浅拷贝只是一种简单的拷贝,让几个对象公用一个内存,然而当内存销毁的时候,指向这个内存空间的所有指针需要重新定义,不然会造成野指针错误。
Tz一号
2020/09/10
8030
​深度解析Python的赋值、浅拷贝、深拷贝
拷贝 就是把原数据复制一份,在复制的数据上随意改动不会影响到其原数据。也就是这里讲的深拷贝。
忆想不到的晖
2021/04/04
5K0
ES6复制拷贝数组,对象,json数组
数组是复合的数据类型,直接复制的话,只是复制了指向底层数据结构的指针,而不是克隆一个全新的数组。
TimothyJia
2019/11/12
2.3K0
javascript关于浅拷贝、深拷贝解析应用,数组的深拷贝
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第32天,点击查看活动详情
鳄鱼儿
2024/05/22
1190
javascript关于浅拷贝、深拷贝解析应用,数组的深拷贝
js 数组对象深拷贝
formData本来是父组件传过来的,但是我不想直接用,于是我直接赋值给一个formDataCopy的对象。
Daotin
2019/08/12
4.8K0
js基础之数据类型和拷贝
了解数据类型前先说说栈(stack)和堆(heap) *** stack为自动分配的内存空间,它由系统自动释放;而heap则是动态分配的内存,大小也不一定会自动释放 ***
用户1974410
2022/09/20
3470
js基础之数据类型和拷贝
python按引用赋值和深、浅拷贝
在计算机语言中,有两种赋值方式:按引用赋值、按值赋值。其中按引用赋值也常称为按指针传值(当然,它们还是有点区别的),后者常称为拷贝副本传值。它们的区别,详细内容参见:按值传递 vs. 按指针传递。
py3study
2020/01/20
7680
js浅拷贝和深拷贝的区别_前端面试深拷贝和浅拷贝
基本数据类型:Boolean、String、Number、null、undefined 引用数据类型:Object、Array、Function、RegExp、Date等
全栈程序员站长
2022/11/15
1.1K0
js浅拷贝和深拷贝的区别_前端面试深拷贝和浅拷贝
js深拷贝和浅拷贝具体使用区别_es6深拷贝和浅拷贝
对于这个问题,可以考虑从深拷贝和浅拷贝的使用或者起源说起,也就是为什么会出现这个问题。
全栈程序员站长
2022/08/04
6650
【前端芝士树】浅拷贝、深拷贝以及Object.assign()的作用、克隆对象、复制数组
基本类型值是指在栈内存保存的简单数据段,在复制基本类型值的时候,会开辟出一个新的内存空间,将值复制到新的内存空间,举个栗子:
CloudCat
2019/05/26
1.9K0
前端面试(8)拷贝
js 的基本数据类型的赋值,就是值传递。引用类型对象的赋值是将对象地址的引用赋值。这时候修改对象中的属性或者值,会导致所有引用这个对象的值改变。如果想要真的复制一个新的对象,而不是复制对象的引用,就要用到对象的深拷贝。
leader755
2022/03/09
3270
前端面试(8)拷贝
JavaScript数组(对象)的深拷贝和浅拷贝
在JavaSCript中的数据类型中,分为两种:原始类型(number/string/boolean/null/undefined)和引用类型(array/object/function)。
celineWong7
2020/11/05
2.4K0
相关推荐
JS 数组、对象的深拷贝
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验