06-深拷贝浅拷贝有什么区别?怎么实现深拷贝

不管现实多么惨不忍睹,都要持之以恒地相信,这只是黎明前短暂的黑暗而已。不要惶恐眼前的难关迈不过去,不要担心此刻的付出没有回报,别再花时间等待天降好运。真诚做人,努力做事!你想要的,岁月都会给你。06-深拷贝浅拷贝有什么区别?怎么实现深拷贝,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

数据类型存储

两大类型:基本类型(保存在栈内存中);复杂类型(保存在堆内存中,引用数据类型的变量是一个指向堆内存中实际对象的引用,存在栈中)

浅拷贝

浅拷贝 指的是创建新的数据,这个数据有着原始数据属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值。如是引用类型,拷贝的是内存地址

即浅拷贝是拷贝的一层,深层次的引用类型则共享内存地址

function newshallowClone(obj){
	const newObj = {};
	for(let prop in obj){
		if(obj.hasOwnProperty(prop)){
			newObj[prop] = obj[prop]
		}
	}
	return newObj;
}

在 js中,存在浅拷贝的现象有:Object.assign;Array.prototype.slice();Array.prototype.concat();使用拓展运算符实现的复制

Object.assign

var obj = {
	age:20,
	vehicle:['benben','perfect'],
	titles:{
		title1:'',
		title2:''
	},
	love:function(){
		console.log('啦啦啦啦')
	}
}
var newRes = Object.assign({},obj);
newRes.age = 22
console.log(obj.age) //20
console.log(newRes.age) //22
newRes.titles.title1 = '1245'
console.log(obj.titles.title1) //'1245'

slice()

const ness = ['s','a','m']
const ness2 = ness.slice(0)
ness2[2] = 'l';
console.log(ness) //["s", "a", "m"]
console.log(ness2) //["s", "a", "l"]

concat()

const ness = ['s','a','m']
const ness2 = ness.concat()
ness2[1] = 'l'
console.log(ness)
console.log(ness2)

拓展运算符

const ness = ['s','a','m']
const ness2 = [...ness]
ness2[1] = 'l';
console.log(ness)
console.log(ness2)

深拷贝

深拷贝:开辟一个新的栈,两个对象的属性完全相同,但是,两个对应不同的地址,修改一个对象的属性,不会改变另一个对象的属性。

场景方式:_.cloneDeep()第三方封装的;jQuery.extend();JSON.stringify();循环递归

_.cloneDeep()

const _ = require("lodash")
const ness = {
	l:188,
	ss:{f:{t:78}},
};
const ness1 = _.cloneDeep(ness);
console.log(ness.ss.f===ness1.ss.f);// false

jQuery.extend()

const $ = require("jquery");
const ness = {
	l:188,
	ss:{f:{t:78}},
	he:[la,ll,mm]
};
const ness2 = $.extend(true,{},ness);
console.log(ness2.ss.f === ness.ss.f);// false

JSON.stringify()

const ness = {
	l:188,
	ss:{f:{t:78}},
	he:['la','ll','mm']
};
const ness3 = JSON.parse(JSON.stringify(ness));
console.log(ness3) // 存在弊端 会忽略 undefined symbol 和函数

都创建出一个新的对象,但是复制对象属性的时候,行为就不一样

浅拷贝 只复制属性指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一内存,修改对象属性会影响原对象

深拷贝 会另外创造一个一样的对象,新对象和原对象不共享内存,修改新的不影响旧对象

拷贝类型为引用类型时:

浅拷贝是复制内存中的地址,拷贝前后的对象,共享了同一块内存,修改会相互影响。

深拷贝 是递归拷贝深层次,属性为对象时,深拷贝是新开栈,指向的是新地址,所以互不影响

相比于npm和yarn,pnpm的优势是什么?

简要:更快速的依赖下载;更高效的利用磁盘空间;更高效的依赖管理;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/163333.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!