JavaScript有6种基本数据类型 字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol(es6引入的一种原始数据类型 表示独一无二)。和3种引用数据类型 对象(Object)、数组(Array)、函数(Function)。
对于引用数据类型 当赋值时会引用同一数据地址 例如:
我们会发现 当改变arr1 数组里面的值的时候也会影响到arr数组的内容。当我们想拷贝一个数组的时候又不想改变原有数组的值 这时候就要深入拷贝
假设我们需要拷贝一个这样的对象
我们要拷贝一个这样的对象的思路
1.循环对象上的属性
2.判断这个属性是本地属性还是继承与prototype对象的属性如果是本地属性则是我们想要拷贝的属性
3.判断这个属性时什么数据类型
4.如果是原始数据类型 那么选择直接拷贝
5.如果是引用数据类型 判断这个引用数据类型是 对象 还是 数组 然后 重复步骤1
话不多说直接上代码
function DeepClone(origin, target) {
var target = target || {}
const toStr = Object.prototype.toString//后面判断一个引用值是数组还是一个对象
const arrStr = "[object Array]"//如果一个引用值是一个数组
for (let prop in origin) {
if (origin.hasOwnProperty(prop)) {
if (typeof origin[prop] == 'object') {
if (toStr.call(origin[prop]) == arrStr) {
target[prop] = []
} else {
target[prop] = {}
}
DeepClone(origin[prop], target[prop])
} else {
target[prop] = origin[prop]
}
}
}
}
测试
当我们改变obj1 里面的内容的时候 发现obj里面的内容不发生改变 那么一个简单的深拷贝就写好了