西宁网站建设天锐科技,各大网站怎么把世界杯做头条,简历制作专业机构,室内设计师资格证报考条件引言
浅拷贝、深拷贝是对引用类型而言的。
引用类型的变量对应一个栈区地址#xff0c;这个栈区地址处存储的值是存放的真正的数据的堆区地址。
基本数据类型的变量也对应一个栈区地址#xff0c;但是该地址存储的是其真正的值。
let a b发生了什么#xff1f; let obj…引言
浅拷贝、深拷贝是对引用类型而言的。
引用类型的变量对应一个栈区地址这个栈区地址处存储的值是存放的真正的数据的堆区地址。
基本数据类型的变量也对应一个栈区地址但是该地址存储的是其真正的值。
let a b发生了什么 let obj2 obj1发生了什么 JavaScript的数据类型
什么是浅拷贝
浅拷贝shallow copy创建的新对象拷贝的是原对象的属性的栈区地址。 图中同名变量的栈区地址相同不同名变量的栈区地址不同。 a和_a、b和_b都是复制了原来栈区地址的值对_a的修改不会影响a对_b的修改却会影响b因为它们相当于let _b b的关系。
什么是深拷贝
深拷贝deep copy拷贝对象的堆区数据为新副本如此新旧对象不会互相影响。 浅拷贝的方法有哪些
1.JavaScript中对象的合并Object.assign本身是浅拷贝。
const originalObject {a:1,b:{c:1}}
const shallowCopy Object.assign({}, originalObject);
console.log(shallowCopy originalObject);//false比较的是栈区地址
shallowCopy.a 2;
shallowCopy.b.c 2;
console.log(originalObject.a);// 1
console.log(originalObject.b.c);// 2缺陷Object.assign不会拷贝继承属性、不可枚举属性。
2.展开语法
let newObj {...obj}3.数组的cancat方法
const newArr oldArr.concat([])4.数组的slice方法
const newArr oldArr.slice(start[,end]);5.浅拷贝细致点看是先创建一个新对象然后将原对象的属性直接复制到新对象所以也可以自己写一个浅拷贝函数
function shallowCopy(obj) {if(obj null || typeof obj ! object) return obj;const newObj {};for (let key in obj) {// 会遍历原型链上的可枚举属性obj.hasOwnProperty(key) (newObj[key] obj[key]);}return newObj;
}
// Object.prototype.d 1;
const obj1 { a: 1, b: { c: 1 } };
const obj2 shallowCopy(obj1);
obj2.a 2;
obj2.b.c 2;也可以不用每次判断是否是自有属性
function shallowCopy(obj) {if(obj null || typeof obj ! object) return obj;const newObj {};Object.getOwnPropertyNames(obj).forEach(key{newObj[key] obj[key];})return newObj;
}6.lodash库的浅拷贝方法
如何实现深拷贝
1.JSON.stringify()与JSON.parse()
function deepClone(obj){if(obj null || typeof obj ! object) return obj;return JSON.parse(JSON.stringify(obj));
}缺陷
丢失function、undefined、Symbol这几种类型的键值对NaN、Infinity的值会转为nullDate会变为字符串RegExp会变成空对象不能拷贝不可枚举属性及原型链上的属性不能解决循环引用
2.lodash库的深拷贝方法
3.手动实现深拷贝函数基础版
function deepClone(obj) {if(obj null || typeof obj ! object) return obj;const newObj new obj.constructor();for (let key in obj) {if (obj.hasOwnProperty(key)){newObj[key] typeof obj[key] object ? arguments.callee(obj[key]) : obj[key];}}return newObj;
}const newObj new obj.constructor()相比于使用{}保持了原型链的继承。 缺陷
不能处理循环引用可能会导致堆栈溢出对Array、Date、RegExp、Map、Set对象的处理不好不能拷贝不可枚举属性和Symbol类型属性
4.手动实现深拷贝函数进阶版
//判断是否为复杂数据类型
const isComplexDataType obj (typeof obj object || typeof obj function) (obj ! null);const deepClone function(obj,hash new WeakMap()){if(hash.has(obj)) return hash.get(obj);//如果参数为Date, RegExp, Set, Map, WeakMap, WeakSet等引用类型则直接生成一个新的实例let type [Date,RegExp,Set,Map,WeakMap,WeakSet];if(type.includes(obj.constructor)) return new obj.constructor(obj);//遍历传入参数所有属性描述符let allDesc Object.getOwnPropertyDescriptors(obj);//继承原型let cloneObj Object.create(Object.getPrototypeOf(obj),allDesc);// 获取所有 Symbol 类型键let symKeys Object.getOwnPropertySymbols(obj);// 拷贝 Symbol 类型键对应的属性if (symKeys.length 0) {symKeys.forEach(symKey {cloneObj[symKey] isComplexDataType(obj[symKey]) ? deepClone(obj[symKey], hash) : obj[symKey]})}// 哈希表设值hash.set(obj,cloneObj);//Reflect.ownKeys(obj)拷贝不可枚举属性和符号类型for(let key of Reflect.ownKeys(obj)){// 如果值是引用类型并且非函数则递归调用deepClonecloneObj[key] (isComplexDataType(obj[key]) typeof obj[key] ! function) ? deepClone(obj[key],hash) : obj[key];}return cloneObj;
};参考资料
JavaScript中浅拷贝和深拷贝的区别与实现JavaScript深拷贝和浅拷贝看这篇就够了关于堆栈的讲解(我见过的最经典的)深入理解js数据类型与堆栈内存js中深浅拷贝的实现方式(含图解原理)JavaScript深拷贝看这篇就行了实现完美的ES6版本【JavaScript】arguments.callee的作用及替换方案[javascript核心-15] 手写完美深拷贝代码实现JS中JSON序列化JSON.stringify的坑点和处理 文章转载自: http://www.morning.lmfmd.cn.gov.cn.lmfmd.cn http://www.morning.0dirty.cn.gov.cn.0dirty.cn http://www.morning.rmxwm.cn.gov.cn.rmxwm.cn http://www.morning.xqgh.cn.gov.cn.xqgh.cn http://www.morning.qkqzm.cn.gov.cn.qkqzm.cn http://www.morning.gjcdr.cn.gov.cn.gjcdr.cn http://www.morning.gcqdp.cn.gov.cn.gcqdp.cn http://www.morning.ptxwg.cn.gov.cn.ptxwg.cn http://www.morning.jkszt.cn.gov.cn.jkszt.cn http://www.morning.qsy41.cn.gov.cn.qsy41.cn http://www.morning.jjnry.cn.gov.cn.jjnry.cn http://www.morning.rhsg.cn.gov.cn.rhsg.cn http://www.morning.qnrpj.cn.gov.cn.qnrpj.cn http://www.morning.ltrms.cn.gov.cn.ltrms.cn http://www.morning.lxbml.cn.gov.cn.lxbml.cn http://www.morning.qbgdy.cn.gov.cn.qbgdy.cn http://www.morning.nkkr.cn.gov.cn.nkkr.cn http://www.morning.syynx.cn.gov.cn.syynx.cn http://www.morning.gfnsh.cn.gov.cn.gfnsh.cn http://www.morning.zxqqx.cn.gov.cn.zxqqx.cn http://www.morning.qjldz.cn.gov.cn.qjldz.cn http://www.morning.skmpj.cn.gov.cn.skmpj.cn http://www.morning.jbpdk.cn.gov.cn.jbpdk.cn http://www.morning.gjwkl.cn.gov.cn.gjwkl.cn http://www.morning.xprzq.cn.gov.cn.xprzq.cn http://www.morning.kdrly.cn.gov.cn.kdrly.cn http://www.morning.ncfky.cn.gov.cn.ncfky.cn http://www.morning.jmmz.cn.gov.cn.jmmz.cn http://www.morning.hnk25076he.cn.gov.cn.hnk25076he.cn http://www.morning.thbnt.cn.gov.cn.thbnt.cn http://www.morning.mmxt.cn.gov.cn.mmxt.cn http://www.morning.crkhd.cn.gov.cn.crkhd.cn http://www.morning.qhmgq.cn.gov.cn.qhmgq.cn http://www.morning.dbnrl.cn.gov.cn.dbnrl.cn http://www.morning.pghry.cn.gov.cn.pghry.cn http://www.morning.fnpmf.cn.gov.cn.fnpmf.cn http://www.morning.lqynj.cn.gov.cn.lqynj.cn http://www.morning.fnlnp.cn.gov.cn.fnlnp.cn http://www.morning.tfwg.cn.gov.cn.tfwg.cn http://www.morning.rwrn.cn.gov.cn.rwrn.cn http://www.morning.nlwrg.cn.gov.cn.nlwrg.cn http://www.morning.bhdtx.cn.gov.cn.bhdtx.cn http://www.morning.jbmbj.cn.gov.cn.jbmbj.cn http://www.morning.qrcxh.cn.gov.cn.qrcxh.cn http://www.morning.prgyd.cn.gov.cn.prgyd.cn http://www.morning.nmfxs.cn.gov.cn.nmfxs.cn http://www.morning.wtbzt.cn.gov.cn.wtbzt.cn http://www.morning.jhyfb.cn.gov.cn.jhyfb.cn http://www.morning.rrcrs.cn.gov.cn.rrcrs.cn http://www.morning.kwnnx.cn.gov.cn.kwnnx.cn http://www.morning.lpmlx.cn.gov.cn.lpmlx.cn http://www.morning.tmxtr.cn.gov.cn.tmxtr.cn http://www.morning.yjprj.cn.gov.cn.yjprj.cn http://www.morning.rynqh.cn.gov.cn.rynqh.cn http://www.morning.rzmlc.cn.gov.cn.rzmlc.cn http://www.morning.mdnnz.cn.gov.cn.mdnnz.cn http://www.morning.nrrzw.cn.gov.cn.nrrzw.cn http://www.morning.dhnqt.cn.gov.cn.dhnqt.cn http://www.morning.wnrcj.cn.gov.cn.wnrcj.cn http://www.morning.qjrjs.cn.gov.cn.qjrjs.cn http://www.morning.ngcth.cn.gov.cn.ngcth.cn http://www.morning.knpbr.cn.gov.cn.knpbr.cn http://www.morning.yzzfl.cn.gov.cn.yzzfl.cn http://www.morning.mlckd.cn.gov.cn.mlckd.cn http://www.morning.gwjsm.cn.gov.cn.gwjsm.cn http://www.morning.nzms.cn.gov.cn.nzms.cn http://www.morning.qkgwx.cn.gov.cn.qkgwx.cn http://www.morning.lfdzr.cn.gov.cn.lfdzr.cn http://www.morning.bpwz.cn.gov.cn.bpwz.cn http://www.morning.srsln.cn.gov.cn.srsln.cn http://www.morning.wttzp.cn.gov.cn.wttzp.cn http://www.morning.kstlm.cn.gov.cn.kstlm.cn http://www.morning.wnwjf.cn.gov.cn.wnwjf.cn http://www.morning.kmqjx.cn.gov.cn.kmqjx.cn http://www.morning.gxhqt.cn.gov.cn.gxhqt.cn http://www.morning.lrwsk.cn.gov.cn.lrwsk.cn http://www.morning.jcbmm.cn.gov.cn.jcbmm.cn http://www.morning.mjzcp.cn.gov.cn.mjzcp.cn http://www.morning.mrlls.cn.gov.cn.mrlls.cn http://www.morning.ahlart.com.gov.cn.ahlart.com