必威体育Betway必威体育官网
当前位置:首页 > IT技术

javascript中数组和对象的深拷贝和浅拷贝

时间:2019-10-30 18:14:34来源:IT技术作者:seo实验室小编阅读:79次「手机版」
 

复制

1、首先理解一下“深拷贝”和“浅拷贝”的区别:

浅拷贝:a = b;//a和b中存的是相同的地址,该地址指向堆内存中相同的地方,即a和b就是一个东西,改变a的值b的值也会跟着改变,同理改变b的值a的值也会发生改变;

深拷贝:a和b中存的地址不同,但是地址对应的堆内存中的内容完全一致,即b是a的副本

2、

(1)数组和对象的浅拷贝一样  ,简单的赋值操作

var b = a;

如数组的浅拷贝:

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

输出的值为:

对象的浅拷贝:

var a = {name:'1',age:'2',color:'3'};
var b = a;
b.name = '5';
console.log('a',a);
console.log('b',b);

输出的值为:

(2)数组的深拷贝(仅针对单层数组)

ES5:var b = a.concat();

var a = ['1','2','3'];
var b = a.concat();
b[0] = '5';
console.log('a',a);
console.log('b',b);

输出的结果为:

ES6 let [...b] = a;或者 let b = [...a]

(3)对象的深拷贝(仅针对单层对象)

ES5: 

var a = {name:'1',age:'2',color:'3'};
function copyObj(a) {
var b = {};
for(var key in a) {
b[key] = a[key];
}
return b;
}
var c = copyObj(a);
c.name = '5';
console.log('c',c);
console.log('a',a);

输出的结果为:

ES6:

let {...b} = a;或者let b = {...a}

这里单层数组和对象的深拷贝实现实际上是Object.assign(target, ...source)的语法糖

补充:

合并数组: 

let arr = ['name']
let arr1 = ['name1', ...arr]
console.log(arr1) //输出 ["name1", "name"]

合并对象:

let obj = {name: 'zyp'}
let obj1 = {name1: 'zyp1', ...obj}
console.log(obj1) //输出 {name1: "zyp1", name: "zyp"}

当然,这里的拷贝也是深拷贝

文章最后发布于: 2018-04-27 13:41:53

相关阅读

分享网站优化中高质量外链平台的选择

网站权重本身是对排名好坏的计算结果,而外链是影响排名的一个十分重要的因素。但现如今的外链建设需要注意很多事情,不像2012年或之

在linux中挂载磁盘ext3和ext4之间的区别

Linux kernel 自 2.6.28 开始正式支持新的文件系统 Ext4。 Ext4 是 Ext3 的改进版,修改了 Ext3 中部分重要的数据结构,而不仅仅像

上门服务已中毒太深,皮条客生意模式如何洞穿?

上门按摩、上门足疗、上门美容,一夜之间啥都上门了,上门真的有那么强的需求么,这是真需求还是伪需求呢?O2O爆发本质上是人口学问题,上

Spring框架中@DateTimeFormat和@NumberFormat的用法

@DateTimeFormat是用来验证输入的日期格式;@NumberFormat是用来验证输入的数字格式。有时候,因为输入习惯或某些要求必须改变格式的

不本商城:SEO在电子商务网站中的应用

电子商务在中国经历了12年的发展之后,已经逐渐成为一个非常成熟的领域,越来越多的人开始关注电子商务并为加入这个领域。正是因为电

分享到:

栏目导航

推荐阅读

热门阅读