首页 > 语言 > JavaScript > 正文

JS中实现浅拷贝和深拷贝的代码详解

2024-05-06 15:38:22
字体:
来源:转载
供稿:网友

(一)JS中基本类型和引用类型

JavaScript的变量中包含两种类型的值:基本类型值 和 引用类型值,在内存中的表现形式在于:前者是存储在栈中的一些简单的数据段,后者则是保存在堆内存中的一个对象。

基本类型值

在JavaScript中基本数据类型有 String , Number , Undefined , Null , Boolean ,在ES6中,又定义了一种新的基本数据类型 Symbol ,所以一共有6种。

基本类型是按值访问的,从一个变量复制基本类型的值到另一个变量后,这两个变量的值是完全独立的,即使一个变量改变了也不会影响到第二个变量。

var str1 = '撩课';var str2 = str1;str2 = 'itlike';console.log(str2); //'itlike'console.log(str1); //'撩课'

引用类型值

引用类型值是引用类型的实例,它是保存在堆内存中的一个对象,引用类型是一种数据结构,最常用的是Object,Array,Function类型,此外还有Date,RegExp,Error等。

在ES6中提供了Set,Map2种新的数据结构。

(二)JS中如何复制引用类型的

基本类型和引用类型赋值的差异化
举个例子:在下面代码中,只修改了obj1中的name属性,却同时改变了ob1和obj2中的name属性。

var obj1 = {'name': '撩课'};var obj2 = obj1;obj2.name = '小撩';console.log(obj1); // {'name': '撩课'}console.log(obj2); // {'name': '撩课'}

当变量复制引用类型值的时候,同样和基本类型值一样会将变量的值复制到新变量上,不同的是对于变量的值,它是一个指针,指向存储在堆内存中的对象。

因为,在JS中,堆内存中的对象无法直接访问,必须要访问这个对象在堆内存中的地址,然后再按照这个地址去获得这个对象中的值。

(三)浅拷贝

在JS中,如果属性是基本类型,拷贝的就是基本类型的值;如果属性是引用类型,拷贝的就是内存地址;所以如果其中一个对象改变了这个地址,就会影响到另一个对象。

下面是JavaScript提供的浅拷贝方法:

Object.assign

ES6中拷贝对象的方法,接受的第一个参数是拷贝的目标,剩下的参数是拷贝的源对象;

语法:Object.assign(target, ...sources)

var p = {  'name': '张三',};var copyP = {};Object.assign(copyP, p);console.log(copyP);console.log(p);

Object.assign是一个浅拷贝,它只是在根属性(对象的第一层级)创建了一个新的对象,但是如果属性的值是对象的话,只会拷贝一份相同的内存地址。

扩展运算符

利用扩展运算符可以在构造字面量对象时,进行克隆或者属性拷贝。语法如下:

var cloneObj = { ...obj };var obj = {'name': '撩课', 'college': ['H5','JAVA','Python']}var obj2 = {...obj};obj.name='小撩';//{'name': '小撩', 'college': ['H5','JAVA','Python']}console.log(obj);//{'name': '撩课', 'college': ['H5','JAVA','Python']}console.log(obj2); obj.college.push('Go');//{'name': '小撩', 'college': ['H5','JAVA','Python','Go']}console.log(obj); //{'name': '小撩', 'college': ['H5','JAVA','Python','Go']}console.log(obj2);            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选