指的是对对象或者数组的拷贝,为了实现拷贝后修改其中一个另一个不受影响。
浅拷贝
就是利用for in将一个对象中的内容都复制一份放到新的对象中。
如果这个对象只要一层结构的话,修改新对象中的数据,原对象不会受影响
但是如果对象有多层机构的话,修改其中一个另一个也会受影响。
//要被拷贝的对象
let o1 = {
name:'rose',
age:20,
love:{
eat:'fruit'
}
}
//准备一个新的对象接收要拷贝的数据
let o2 = {}
//遍历要拷贝的数据
for(let k in o1){
o2[k] = o1[k]
}
//这种情况下,修改新对象第一层的结构中的数据,原对象不会受到影响;但是修改第二层的结构中的数据,那原对象中的数据也发生相应的变化。
深拷贝
就是利用for in和递归函数将一个对象中的内容都复制一份放到新的对象中。
深拷贝的情况下,其中一个对象里面的数据发生变化不会影响到另一个对象。
const o1 = {
name: 'Jack',
age: 18,
info: {
height: 180,
weight: 180,
desc: {
message: '今天天气很好',
a: {
b: 100,
c: {
d: 200
}
}
}
},
address: {
city: '北京'
},
hobby: ['吃饭', '睡觉', ['打王超',['666']]]
}
//准备一个一样的数据类型
let o2 = {}
//利用递归函数,在函数内部调用
function deepCopy(o2,o1){
for(k in o1){
// 判断要拷贝的是不是对象
if (Object.prototype.toString.call(o1[k]) === '[object Object]') {
// 能执行到这里说明是一个对象数据类型
// 需要再次创建一个对象
o2[k] = {}
deepCopy(o2[k],o1[k])
// 判断要拷贝的是不是数组
}else if(Object.prototype.toString.call(o1[k]) === '[object Array]'){
o2[k] = []
deepCopy(o2[k],o1[k])
}else{
o2[k]=o1[k]
}
}
还有一种实现深浅拷贝的方式,就是利用JSON数据格式
第一步:
把js数据类型转换成JSON数据类型 let res = stringify(o1)
第二步:
就是把JSON格式数据转成js格式数据 let o2 = JSON.parse(JSON.stringify(o1))
自执行函数
就是函数自己调用自己 (function name(){})()