You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// 方法:用户合并一个或多个对象到第一个对象// 参数:// target 目标对象 对象都合并到target里// source 合并对象// deep 是否执行深度合并functionextend(target,source,deep){for(keyinsource)if(deep&&(isPlainObject(source[key])||isArray(source[key]))){if(isPlainObject(source[key])&&!isPlainObject(target[key])){target[key]={};}if(isArray(source[key])&&!isArray(target[key])){target[key]=[];}// 执行递归extend(target[key],source[key],deep)}elseif(source[key]!==undefined){target[key]=source[key];}}// Copy all but undefined properties from one or more// objects to the `target` object.$.extend=function(target){vardeep,args=slice.call(arguments,1);//第一个参数为boolean值时,表示是否深度合并if(typeoftarget=='boolean'){deep=target;//target取第二个参数target=args.shift()}// 遍历后面的参数,都合并到target上args.forEach(function(arg){extend(target,arg,deep)})returntarget}
lodash 中的深拷贝
[源码地址](
The text was updated successfully, but these errors were encountered:
基本类型: undefined, boolean,number,string,null,symbol
引用类型:Object
实现浅拷贝
实现深拷贝:
问题:
对于这个问题,一种方法是通过语言上的尾调用优化来解决,另一种就是迭代变为循环,对于这种方法存在两种不同的解决思路,一种就是写一个通用函数,可以将所有尾递归函数变为循环,另一种方式直接改动语言来实现,这种可以更加灵活的去解决遇见的其他问题。
通用递归变为循环的函数:
尾递归优化只在严格模式下生效,那么在正常模式下,或者在那些不支持该功能,就只有自己实现尾递归优化了。
将递归变为循环
上面这两个问题可以通过缓存来实现,我们将我们已经克隆的对象都缓存下来,并且和原对象连接起来,代码如下:
使用对象描述符进行进行深拷贝
结构化克隆算法
结构化克隆算法是HTML5用于复制复杂javascript对象的算法,通过来workers的postMessage()或者使用IndexedDB存储对象时在内部使用,他通过递归输入对象来构造克隆,同时保证先前访问过引用的访问,以避免无限便利循环。
开源库实现方式
lodash 中的深拷贝
[源码地址](
The text was updated successfully, but these errors were encountered: