深拷贝和浅拷贝的方法
浅拷贝比较简单,一般只要直接把想要拷贝的引用数据类型给要保存的变量就行,因为保存有引用数据类型的变量里的值其实是引用数据类型的地址,等于说只是传了地址而已,它们指向的是同一个引用数据类型。也就是说只要有一个变量改变了引用数据类型的值,另外一个变量也会跟着变。
而深拷贝相当于就是重新在内存空间新建一个,然后将想要拷贝的内容保存在这个内存中。
方法一:用es6的对象方法:Object.assign()
var obj1 = {a:1,b:2}
var obj2= Object.assign({},obj1);//深拷贝
var obj3= Object.assign(obj1,{});//浅拷贝
差不多可以理解为:
深拷贝是先创建一个新对象,再往里面赋值,然后将新对象(这里给的是地址)给obj2.
浅拷贝就是直接在obj1里添加数据,然后再把obj1(注意,这里也给的是obj1的地址)给obj3.
方法二:通过js的内置对象JSON来进行数组对象的深拷贝
function deepClone2(obj) {
var _obj = JSON.stringify(obj),
var objClone = JSON.parse(_obj);
return objClone;
}
JSON.stringify()
将对象转换成JSON字符串
JSON.parse()
反序列化将JSON字符串变成一个新的对象
这里是先将obj转化为JSON 字符串,然后再将这个JSON 字符串转化为对象,然后将这个对象的地址给objClone.
方法三:通过数组的concat()
方法实现深拷贝。
语法:concat()
合并两个或多个数组,返回一个新数组。原数组不变.
let arr = [1,2,3,4];
let newArr = arr.concat()
arr.push(5);
console.log(arr); // [1,2,3,4,5]
console.log(newArr ); // [1,2,3,4]
方法四:扩展运算符的方法深拷贝
let obj1 = {
name: "小李",
age: 18
}
let obj2 = {...obj1}
obj1.name = '小张';
obj1.age = '25';
console.log(obj1, obj2);
//此时obj1的值已经被更改,但是obj2的值还是obj1改变之前的值。
let arr = [1, 2, 3]
let newArr = [...arr]
arr[0] = 999
console.log(arr, newArr)
//arr:[999,2,3]
//newArr:[1,2,3]
方法五:JQuery中的extend()
方法
// 注意要引入jQuery
let obj1 = {
name: "张三",
age: 18,
father: {
age: 45
},
fn: function () {
return 123
}
}
let obj2 = $.extend(true, {}, obj1)
obj1.father.age = 50;
console.log(obj1,obj2);
//这里obj1里的father对象中的age属性变成了50,而obj2还是原来的45.