Cópia rasa: O tipo de dado de referência apenas atribui o endereço de referência a outra variável ao atribuir um valor. Após a atribuição, as duas variáveis apontam para o mesmo endereço na memória heap e quaisquer operações afetarão uma à outra.
Cópia profunda: o tipo de dados de referência copia todo o conteúdo para outra variável e um novo espaço é criado na memória heap para os dados copiados. As duas variáveis na verdade apontam para dois endereços de referência e as operações subsequentes não afetam uma à outra.
Três ideias de implementação de deep copy:
1. Percurso + recursão (recursão é para garantir que a cópia não seja completa quando houver aninhamento nos dados e as operações subsequentes das duas variáveis se afetem)
A primeira etapa: Loop Traversal (percorrer cada propriedade de um objeto, adicionar cada propriedade do objeto e seu valor a outro objeto)
Etapa 2: Encapsule a função (realize a cópia profunda do objeto e o valor de retorno é o objeto após a cópia profunda)
Etapa 3: Array.isArray(): determine se uma coisa é uma matriz
三元运算符
条件?对:不对//判断obj是否是数组类型,若是,则obj2被初始化为[],否则{}
if (Array.isArray(obj) == true) {
var obj2 = []
} else {
var obj2 = {}
}
var obj = { name: '李煜', age: 30, sex: true, hobby: ['打球', '听音乐'] };
function copyObj(obj) {
// // 判断obj2是否是数组类型
// var obj2 = Array.isArray(obj)
// // 如果obj2是数组类型则将obj2初始化为空数组,否则初始化为空对象
// if (obj2){
// obj2=[]
// }else{
// obj2={}
// }
var obj2 = Array.isArray(obj) ? [] : {}
for (var key in obj) {
// //判断属性值是否为引用类型,如果是引用类型,则需要继续循环遍历处理该属性的值(递归)
// if (typeof obj[key] == 'object') {
// obj2[key] = copyObj(obj[key])
// }else{//不是引用类型, 直接拷贝该属性的值
// obj2[key] = obj[key]
// }
obj2[key] = (typeof obj[key] == 'object' ? copyObj(obj[key]) : obj[key])
}
return obj2
}
var obj2 = copyObj(obj)
console.log(obj, obj2);
obj.hobby.push('coding')
console.log(obj, obj2);
O resultado da execução do código:
2. Método JSON
JSON.stringify (): Converte o objeto JSON em string JSON (a string json requer que cada nome de atributo na string seja agrupado com " ", sem comentários, sem vírgulas extras)
JSON.parse (): converte uma string JSON em um objeto JSON
var obj = { name: '李煜', age: 30, sex: true, hobby: ['打球', '听音乐'] };
var obj2=JSON.parse(JSON.stringify(obj))
console.log(obj, obj2);
obj.hobby.push('coding')
console.log(obj, obj2);
O resultado da execução do código:
3. atribuir função (na verdade, ele apenas realiza a cópia das propriedades de primeiro nível do objeto e também é uma cópia superficial em essência):
É equivalente ao processo de "julgar se o valor do atributo-chave é um tipo de referência em obj1 e, se for, você precisa continuar a percorrer o valor do atributo (processar recursivamente o valor do atributo)" e este processo não é executado
var obj2=Object.assign({ },obj)
var obj = { name:'李煜', age:30,sex:true,hobby:['打球','听音乐'] };
var obj2 = Object.assign( {}, obj );
console.log( obj, obj2 );
obj.hobby.push('coding');