浅拷贝:将原对象或原数组的引用直接赋给新对象,新数组,新对象/数组只是原对象的一个引用
浅拷贝只是指向被复制的内存地址,原地址的对象发生改变,那么浅复制出来的值也会发生改变
深拷贝:创建一个新的对象和数组,将原对象的各项属性的“值”(数组的所有元素)拷贝过来,是“值”而不是“引用”
开辟了一块内存地址用于存放复制的对象
*浅拷贝和深拷贝的区别在于是否真正的获取了一个对象的复制而不是引用
1.引用只发生在对象身上
// 这种不算是深浅拷贝,只是复制
var arr1=[1,2,3];
var arr2=arr1;
arr1.push(4);
alert(arr1); //1234
alert(arr2); //1234
2.slice(start,end) 不带参数相当返回新数组 从已有数组中截取一部分元素片段成新数组(不改变原数组)
var array = [1, 2, 3, 4];
var copyArray = array.slice();
copyArray[0] = 100;
console.log(array); // [1, 2, 3, 4]
console.log(copyArray); // [100, 2, 3, 4]
3.concat() 用于连接两个或者多个数组 不改变原数组,返回一个被连接数组的副本
var array = [1, 2, 3, 4];
var copyArray = array.concat();
copyArray[0] = 100;
console.log(array); // [1, 2, 3, 4]
console.log(copyArray); // [100, 2, 3, 4]
4.ES6
// (1) Array.from(要复制的数组) 把一个类数组或者可遍历对象转换成一个真正的数组
var arr1=[1,2,3];
var arr2=Array.from(arr1);
arr1.push(4);
alert(arr1); //1234
alert(arr2); //123
// (2) ...扩展运算符 取出参数对象中所有可遍历属性拷贝到当前对象中
var arr1=[1,2,3];
var arr2=[...arr1];
arr1.push(4);
alert(arr1); //1234
alert(arr2); //123
// Object.assign(target, source1, source2) 用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target),并返回合并后的target
var obj = {
name: '彭湖湾',
job: '学生'
}
var copyObj = Object.assign({}, obj);
copyObj.name = '我才不是! 哼 (。・`ω´・)';
console.log(obj); // {name: "彭湖湾", job: "学生"}
console.log(copyObj); // {name: "我才不是! 哼 (。・`ω´・)", job: "学生"}
5.不仅拷贝第一层级,还能够拷贝数组或对象所有层级的各项值
不是单独针对数组或对象,而是能够通用于数组,对象和其他复杂的JSON形式的对象
// JSON.parse(JSON.stringify(XXXX)) 一招鲜吃遍天
var array = [
{ number: 1 },
{ number: 2 },
{ number: 3 }
];
var copyArray = JSON.parse(JSON.stringify(array))
copyArray[0].number = 100;
console.log(array); // [{number: 1}, { number: 2 }, { number: 3 }]
console.log(copyArray); // [{number: 100}, { number: 2 }, { number: 3 }]
// 通过immutable引入的一套API,实现
// 在改变新的数组(对象)的时候,不改变原数组(对象)
// 在大量深拷贝操作中显著地减少性能消耗
const { Map } = require('immutable')
const map1 = Map({ a: 1, b: 2, c: 3 })
const map2 = map1.set('b', 50)
map1.get('b') // 2
map2.get('b') // 50