文章目录
一、拷贝是什么?
1.概念
拷贝就是复制的意思。在JS中通常是指复制数据。
2.两种数据类型的拷贝方式
1: 基本数据类型
number(数字) string(字符串) boolean(布尔值) undefined(未定义) null(空) symbol(符号)
基本数据类型直接传值互不影响。
var a = 100;
var b = a; // 赋值、传值
b = 99;
console.log(a);// 100
console.log(b);// 99
2: 引用数据类型
object(对象) array(数组) function(函数)
引用数据类型一般是传地址,由于共用一个地址导致数据会相互影响
var c = { color: "red" }
var d = c;// 传址、传地址
d["color"] = "green";
console.log(c);// {color: "green"}
console.log(d);// {color: "green"}
二、使用方法
1.浅拷贝
浅拷贝不对数据的数据类型进行判断,只拷贝第一层数据,不能拷贝如二维数组之类的有嵌套关系的数据。
代码如下:
// 封装浅拷贝函数
function simpleCopy(data) {
// 判断data是否为数据集合
if (typeof data === 'object') {
// 判断是数组,还是对象
var newData = Array.isArray(data) == true ? [] : {};
// 循环
for (var key in data) {
// 复制
newData[key] = data[key];
}
// 循环结束,返回新的数据集合
return newData;
}
}
2.深拷贝
在复制数据的过程中,会判断每一层结构的数据类型,通过递归的方式,不断复制,不断判断数据类型,如果是基本数据类型,就直接复制,传值; 如果是引用数据类型,就执行递归,直到复制的数据为基本类型为止。
代码如下:
//封装深拷贝函数
function deepCopy(data){
// 创建新地址
var newData = Array.isArray(data) === true ? [ ]: {};
// 循环data
for(var key in data){
// 判断拷贝的数据是否为引用类型
if(typeof data[key] === "object")
//执行递归,直到复制的数据为基本类型为止
newData[key] = deepCopy(data[key]);
}
else {
//是基本数据类型,就直接复制
newData[key] = data[key]
}
}
//返回新数据
return newData;
}
var newObj2 = deepCopy(obj2)
newObj2["result"]["width"] = "99px";
console.log(obj2);// {color: "red", result: {width: "100px"}}
console.log(newObj2);// {color: "red", result: {width: "99px"}}
总结
深拷贝和浅拷贝是在复制对象或数组时使用的两种不同的方法。
浅拷贝是指创建一个新的对象或数组,新对象或数组中的元素是原始对象或数组中元素的引用。这意味着,如果原始对象或数组中的元素是对象或数组,它们仍然会被共享。
深拷贝是指创建一个完全独立的新对象或数组,新对象或数组中的元素与原始对象或数组中的元素完全相同,但不共享引用关系。