JS中实现浅拷贝和深拷贝的代码详解中实现浅拷贝和深拷贝的代码详解
(一)(一)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是一个浅拷贝,它只是在根属性(对象的第一层级)创建了一个新的对象,但是如果属性的值是对象的话,只会拷
贝一份相同的内存地址。
扩展运算符扩展运算符
评论0