js 深拷贝 和 浅拷贝
var Obj1 = {'name':'张三','age':28};
var Obj2 = Obj1;
浅拷贝:直接赋值是浅拷贝方式,Obj2和Obj1在栈中虽然是两个空间,但是他们都指向堆中的同一个空间,当Obj1改变的时候,Obj2也会改变
深拷贝方法:
方法1:基于基础JSON数据格式的转换,其他如Reg、function、Set、Map等将来出现的数据类型都是不支持的,如果对象中含有这些元素,转换时将丢失
var Obj2 = JSON.parse(JSON.stringify(Obj1));
方法2:定义自己的工具包,实现一个深拷贝,供框架使用 Object.prototype.toString.call() 没有意外情况的对象类型判断
const OBJECT_TYPE = "[object Object]";
//优化:Map会对内部数据持有强引用,导致数据无法被内存回收
//WeakMap:弱引用
//var o1 = new Map(); o1 = null; 无法被回收,操作无用
//var o2 = new WeakMap();o2 = null; 可以回收
const map = new WeakMap();
function deepClone(obj)
{
//基于数据基本类型,不去处理
//function不去处理,用来复用
if(typeof obj !== 'object' || !obj)
{
return;
}
if(map.has(obj)) return map.get(obj);
let params;
//引用数据类型:按不同的处理方式分类
//1、通过构造函数入参的
if(obj instanceof Date || obj instanceof Regex)
{
params = obj;
}
let tmp = new obj.constructor(params);
map.set(obj,tmp);
//2、特殊API添加原色的Set、Map
if(obj instanceof Map)
{
for(let [key,val] of obj)
{
//todo:key和val有可能是对象
tmp.set(deepClone(key),deepClone(val));
}
}
else if(obj instanceof Set)
{
for(let val of obj)
{
//todo:val有可能是对象
tmp.add(deepClone(val));
}
}
else if(Array.isArray(obj) || Object.prototype.toString.call(obj) == OBJECT_TYPE )
{
for(let key in obj)
{
tmp[key] = deepClone(obj[key]);
}
}
//3、通过key + value直接操作的:对象、数组
return tmp;
}
CSDN-Ada助手: 恭喜博主第11篇博客发布成功!对于js脱敏的探讨让我受益匪浅。希望博主能继续保持创作的热情,不断分享有价值的内容。或许下一步可以考虑深入探讨js脱敏的实际应用场景,或者结合其他技术进行更深入的研究。期待博主更多精彩的作品!
CSDN-Ada助手: 恭喜您写了第9篇博客!标题“Host key verification failed.”让我想起了处理技术问题的重要性。您在博客中提到了一个常见的错误,这个问题可能是许多读者在使用主机密钥时遇到的困扰。我非常感谢您分享了解决这个问题的方法。 接下来,我想建议您在未来的创作中继续分享更多关于技术问题和解决方案的实用内容。您的经验和知识对读者来说非常有价值。同时,您也可以考虑探索一些相关的主题,例如网络安全、系统管理等等。这将进一步丰富您的博客,并吸引更多读者。 再次恭喜您的持续创作,期待看到您未来更多的精彩博客!谢谢您的努力与分享。
CSDN-Ada助手: 恭喜博主撰写了第十篇博客!标题中的“前端获取设备电池信息”引起了我的兴趣。你的文章内容对于前端开发者来说肯定是非常有用的。不过,我在这里想提供一些建议,希望能够帮助你进一步改进你的创作。 首先,我认为你可以在博客中进一步探索不同设备的兼容性问题,例如iOS和Android系统中获取设备电池信息的差异。这将帮助读者更好地理解如何在各种设备上应用你提供的解决方案。 其次,你可以考虑添加一些实际的示例代码和演示,以帮助读者更好地理解你所介绍的概念。这将使你的博客更加具有实践性,并且读者可以直接运行代码来验证你的解决方案。 最后,你可以继续分享其他前端开发领域的知识和经验,比如响应式设计、性能优化等等。这将进一步丰富你的博客内容,吸引更多读者。 再次恭喜你的持续创作!期待看到更多优质的内容。谢谢你与我们分享你的知识。
CSDN-Ada助手: 恭喜您写了一篇非常有价值的博客,对于前端跨域问题提供了很好的解决方式。我认为您可以继续深入探讨前端开发中的其他难点,并分享给更多人。或许可以写一篇介绍前端性能优化的文章,这也是很多开发者比较关心的问题。再次感谢您的分享,期待更多优质的博客。 CSDN 会根据你创作的博客的质量,给予优秀的博主博客红包奖励。请关注 https://bbs.csdn.net/forums/csdnnews?typeId=116148&utm_source=csdn_ai_ada_blog_reply8 看奖励名单。
CSDN-Ada助手: 恭喜您写下了第7篇博客!您的经验分享对于社区的其他成员来说一定非常有价值。关于下一步的创作建议,我建议您可以继续分享关于VUE fullcalendar的更深入的使用心得,或者探讨其他与排班相关的技术话题。期待看到更多精彩的文章! CSDN 会根据你创作的博客的质量,给予优秀的博主博客红包奖励。请关注 https://bbs.csdn.net/forums/csdnnews?typeId=116148&utm_source=csdn_ai_ada_blog_reply7 看奖励名单。