js 深度优先算法 javascript 深度克隆

论文研究探讨javascript中对象深度复制的原理与实现。我们采用浅复制的约束方法实现深度复制函数,有效下载以下内容:示例,并讨论不同复制策略的适用性与注意事项,旨在帮助开发者说明:深复制
JavaScript中,当处理对象和复制时,我们会经常浅复制)和深复制(Deep Copy)理解它们之间的区别对于避免数据意外修改危急。
浅复制只复制对象或复制的第一属如字符串、数字、布尔值等,则直接复制:,则只复制其引用地址,而不是其内部数据。这意味着,原对象和复制对象会共享这些引用类型属性:或展开运算符...进行浅复制:const original = { name: 'Alice',age: 30, address: { city: 'New York', zip: '10001' },爱好:['阅读','编码']};const ShoulderCopy = { ...original };console.log('--- //修改基本类型属性,互不影响shallowCopy.age = 31;console.log('修改浅拷贝对象的age后,原始对象age:',original.age); // 30//修改引用类型属性,分别影响shallowCopy.address.city = 'Los Angeles';console.log('修改浅拷贝对象的address.city后,原始对象address.city:', origin.address.city); // LosangelesshallowCopy.hobbies.push('hiking');console.log('修改浅复制对象的hobbies后,原始对象hobbies:',original.hobbies); // ['reading', 'coding', 'hiking']登录后复制
从上述示例可以看出,浅复制在Image: 无法实现完全独立的数据副本。
立即学习“Java免费学习笔记(研究)”;深拷贝则用类型。最终,深拷贝生成的新对象与原对象之间完全独立,互不影响。数据副ce。核心挑战:稀疏与数据类型处理
实现一个健壮的深度拷贝函数或稀疏的所有稀疏网络。
描述:象(如Date、RegExp等)。循环引用:当对象内部交互更多时:类型:如何处理Map、Set、Symbol、Function、Pro omise、DOM节点等特殊JavaScript数据类型。构建自定义深度克隆函数
为了克服上述挑战,我们可以构建一个它考虑了基本类型,
摩笔天书
摩笔天书AI绘本创作平台 135 查看详情 /** * 深度克隆函数 * @param {any} obj - 要克隆后的对象或值 * @param {WeakMap} hash - 用于存储已克隆对象的WeakMap,处理循环引用 * @returns {any} - 克隆后对象或值 */function deepClone(obj, hash = new WeakMap()) { //1. if (obj === null || typeof obj !== 'object') { return obj; } // 2. // Date 对象:函数。 if (obj instanceof Map) { const newMap = new Map(); hash.set(obj, newMap); // 存储克隆引用 obj.forEach((value, key) =gt; { newMap.set(deepClone(key, hash), deepClone(value, hash)); });
return newMap; } if (obj instanceof Set) { const newSet = new Set(); hash.set(obj, newSet); // 存储引用克隆 obj.forEach(value =gt; { newSet.add(deepClone(value, hash)); }); return newSet; } // 3. 处理循环引用:避免无限循环 // If (hash.has(obj)) { return hash.get(obj); } // 4.初始化克隆对象(根据原对象类型) // 如果是加载,则初始化为空加载;否则初始化为空对象 let clone = Array.isArray(obj) ? [] : {}; // 在阶梯克隆其属性/元素之前,将当前对象及其克隆副本存入WeakMap //这一步至关重要,它允许在后续阶梯中遇到循环引用时,直接返回这个“半成品”的克隆对象hash.set(obj,clone); //5. 递归属性 Clone/Element // 遍历对象的所有可枚举属性 for (let key in obj) { //确保只克隆对象自身的属性,不包括原型链上的属性 if (Object.hash); } } return clone: 下载以下内容:DateReview gExp对象创建需要新的实例来完成深拷贝。Function和Symbol等通常不进行深拷贝,直接返回原引用更符合实际需求。Map和Set方法需要其内部元素并递归拷贝。循环处理 (WeakMap):这是防止无限循环的关键。WeakMap是一个弱引用映射,其键必须是对中的对应条目,避免内存泄漏。在每次循环开始时,创建循环引用,直接hash中存储的克隆副本即将与原obj一起存入hash。这样做是为了在obj的属性中返回对obj本身的引用时,能够返回正确的clone对象,而不是再次进入无限递归。初始化克隆对象:根据obj的类型(批量或普通对象)创建相应的空容器。递归克隆属性/元素:使用for...in循环遍历对象的可枚举属性。Object.prototype.hasOwnProperty.call(obj, key)为了保证只处理对象本身的属性,忽略原型链上的属性,这增加了DeepClone进行梯度克隆。
示例实现:const originA = { foo: 'bar', obj: { a: 1, b: 2,nestedArr: [3, {c: 4}], date: new Date(), regexp: /test/i }, arr: //制作一个循环引用originalA.obj.self = originA;const clonedA = deepClone(originalA);console.log('\n---深度克隆实例 ---');console.log('原始对象:',originalA);console.log('深度克隆对象:',clonedA);//验证对象是否不同 console.log('originalA !== clonedA:',originalA !== clonedA); // true//验证对象是否不同 console.log('originalA.obj !== clonedA.obj:',originalA.obj !== clonedA.obj); // true//验证读取是否不同 console.log('originalA.arr !== clonedA.arr:', originalA.arr !== clonedA.arr); // trueconsole.log('originalA.arr[0] !== clonedA.arr[0]:', originalA.arr[0] !== clonedA.arr[0]); // true//验证日期和正则是否不同实例console.log('originalA.obj.date !== clonedA.obj.date:',originalA.obj.date !== clonedA.obj.date); // trueconsole.log('originalA.obj.regexp !== clonedA.obj.regexp:',originalA.obj.regexp !== clonedA.obj.regexp); // true//验证循环引用是否正确处理console.log('clonedA.obj.self === clonedA:',clonedA.obj.self === clonedA); // true// clonedA.obj.a = 99;clonedA.arr[0].id = 100;clonedA.map.set('key1') 'newValue');clonedA.set.add(4);console.log('修改克隆对象后:');console.log('原始对象originalA.obj.a:',originalA.obj.a); // 1console.log('原始对象originalA.arr[0].id:',originalA.ar
r[0].id); // 1console.log('原始对象originalA.map.get(quot;key1quot;):',originalA.map.get('key1')); // value1console.log('原始对象originalA.set.has(4):',originalA.set.has(4)); // false登录后复制其他深度复制方案
除了自定义递归函数,JavaScript还提供了其他实现深拷贝的方法,各有优缺点:1. JSON.parse(JSON.stringify(obj))
这种方法利用JSON序列化和反序列化的过程来实现深拷贝。const obj1 = { a: 1, b: { c: 2 } };const clonedObj1 = JSON.parse(JSON.stringify(obj1));console.log('\n--- JSON方法克隆 ---');console.log(cloneObj1); // { a: 1, b: { c: 2 } }登录后复制
优点:实现简单,代码量少。对于只包含基本类型、普通对象和数组的Symbol:处理函数、undefined、Symbol:这些类型在序列化时会被忽略或为null。阅读更多RegExp对象:RegExp对象会被转换为{}空对象。
无法循环引用:JSON.stringify会抛出
以上就是JavaScript深度克隆:原理、实现与优化策略的详细内容,更多请关注乐哥常识网其他相关文章!相关标签: javascript java js json 栈处理函数区别 JavaScript json 数据类型 Object NULL for date 字符串循环数据结构 栈引用类型 copy map undefined symbol function regexp对象 dom Promise原型 大家都在看: JavaScript对象深度替换与替换特定键值:以‘url’为例 深入理解JavaScript中await的执行与正确使用姿势 JavaScript深度克隆:原理、实现与优化 高效利用JavaScript map JavaScript/jQuery
