深拷贝和浅拷贝的方法

深拷贝和浅拷贝的方法

浅拷贝比较简单,一般只要直接把想要拷贝的引用数据类型给要保存的变量就行,因为保存有引用数据类型的变量里的值其实是引用数据类型的地址,等于说只是传了地址而已,它们指向的是同一个引用数据类型。也就是说只要有一个变量改变了引用数据类型的值,另外一个变量也会跟着变。

而深拷贝相当于就是重新在内存空间新建一个,然后将想要拷贝的内容保存在这个内存中。

方法一:用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.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值