浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存
所谓的浅拷贝就是将原数据重新进行二次赋值, 当我们修改了现引用数据类型的内容, 原引用数据类型的内容也会发生变化
深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象
所谓的深拷贝就是将数据重新进行复制, 复制的之后的数据与原数据没有任何关联,当我们修改新数据的时候, 原数据不会发生变化
function getDataType(arg) {
// 检测变量的数据类型
let dataType = Object.prototype.toString.call(arg); // [object String]
let mapType = {
'[object Boolean]': 'boolean',
'[object Number]': 'number',
'[object String]': 'string',
'[object Function]': 'function',
'[object Array]': 'array',
'[object Date]': 'date',
'[object RegExp]': 'regExp',
'[object Undefined]': 'undefined',
'[object Null]': 'null',
'[object Object]': 'object'
}
return mapType[dataType]
}
var array = ["vue", 1, undefined, true, null, function test() { }, { age: 1 }, ["html", "css"]]
function copy(array) {
var obj;
var str = getDataType(array)
if (str === 'array') {
obj = []
for (let i = 0; i < array.length; i++) {
obj.push(copy(array[i]))
}
} else if (str === 'object') {
obj = {}
for (let i in array) {
obj[i] = copy(array[i])
}
} else {
return array
}
return obj
}
var data = copy(array)
data[6].age = 100
data[7][0] = "git"
console.log("old",array)
console.log("new", data)
1.首先我们需要封装一个可以判断数据类型的函数,
2.写一个深拷贝函数方法,引用判断数据类型的函数,判断数据,如果是多种类型,那么我们就要用到循环递归去添加到新的数据中
3.直接使用深拷贝函数方法,拷贝数据。