深拷贝,浅拷贝

==============

变量存储类型分两类

①基本类型:直接存储在栈中的数据。(字符串、布尔值、未定义、数字、null)

②引用类型:将该对象引用地址存储在栈中,然后对象里面的数据存放在堆中。(数组、对象、函数)

这里解释一下为什么null是基本类型:有人说他用type of打印出来不是oject吗?

null只是一个空指针对象,没有数据。根据引用类型特点可以看一下是否符合。

=================

深拷贝和浅拷贝还有赋值的区别

浅拷贝:也就是拷贝A对象里面的数据,但是不拷贝A对象里面的子对象

深拷贝:会克隆出一个对象,数据相同,但是引用地址不同(就是拷贝A对象里面的数据,而且拷贝它里面的子对象)

赋值:获得该对象的引用地址

在这里插入图片描述

浅拷贝:

!!!! 只有第一层数据不会随着变 但是如果数组里面嵌套对象或者数组 就会随着变
扩展运算符 和 array.assign()

var x=[1,2,{'a':1}];
y=x;
z=[...x];
y[0]=2;
y[2].b=2;
z[2].a=2;
console.log(x,y,z) // x,y: [2,2,{a:2,b:2}]       z: [1,2,{a:2,b:2}]

还包括slice()

var arr=[1,[10,10,10],2,3];
var ar=arr.slice(0,2);
arr[1][1]=1
arr[0]=2
console.log(arr); // [ 2, [ 10, 1, 10 ], 2, 3 ]
console.log(ar); // [ 1, [ 10, 1, 10 ] ]

和 concat()

var arr2=[[1]]
var ar2=[[1]];
var a=arr2.concat(ar2);
console.log(a);
console.log(arr2);
console.log(ar2);
 
arr2[0][0]=100;
ar2[0][0]=200; 
console.log(a);  // [ [ 100 ], [ 200 ] ]
console.log(arr2);  // [ [ 100 ] ]
console.log(ar2); // [ [ 200 ] ]
a[1][0]=300;
console.log(ar2); //  [ [ 300 ] ]
深拷贝方法:
  1. str = JSON.stringify(obj) 先将对象转换为字符串
    JSON.parse(str) 然后再将字符串转为对象

2 递归拷贝:
浅拷贝 + 递归,浅拷贝时判断属性值是否是对象,如果是对象就进行递归操作,两个一结合就实现了深拷贝

var deepCopy = function(obj) {
	if (typeof obj !== 'object') return;
	var newObj = obj instanceofArray ? [] : {};
	for (var key in obj) {
		if (obj.hasOwnProperty(key)) {
			newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key];
		}
	}
	return newObj;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值