介绍
这篇文章给大家分享的是有关JS对象之浅克隆和深克隆的案例分析的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。
<强>浅克隆强>
先看代码:
/* * *浅克隆克隆传入对象,只克隆一层 * @param{一}来源 */函数shallowClone(源){ var tiaget=createEctype(源);//创建一个副本//将原对象的所有属性值赋值到新对象上 (var属性的源){ 如果(source.hasOwnProperty(财产)){ tiaget[属性]=[属性]来源; } }/* * *创建副本 * @param{一}来源 */函数createEctype(源){ var newObject={}; 如果(Array.isArray(源)) newObject=[]; 返回newObject; } 返回tiaget; }
执行测试:
===newa;//错误 newa===newa.a4 [0];//错误 newa===newa.b.a;//错误===newa.a4 [0];//正确的 一个===newa.b.a;//真正的
测试执行速度:
/* * 获取传入方法在规定时间内执行次数 示例: var测试=function () { }; 运行时(测试,1) 表示测试方法在1秒中执行了6819005次 * *//* * *获取传入方法在规定时间内执行次数 * @param任何}{fn执行的方法 * @param{}时间规定的时间,单位为秒 */函数运行时(fn) { var开始时间=Date.now (); var计算=0; 而(Date.now()——开始时间& lt;时间* 1000){ fn.call (); 数+ +; } 返回计数; }
<强>深度克隆强>
代码:
/* * *深克隆 * *示例: * var={a1:1 a2:2, a3: [1, 2, 3]}; * var b={b1:1 b2:2, b3: (4、5、6)} * a.b=b; *本科=一个; * a.a4=[a, b]; * b.b4=[a, b]; * a.fn=function () {console.log (this.b);返回this.b;}; * * var newa=deepClone(一个); * newa.a1=123; * newa.fn (); */函数deepClone(源){ 这一点。objKeyCache=[];//对象缓存 这一点。objValueCache=[];//对象克隆缓存 这一点。克?function(源){ var=createEctype目标。调用(这,来源); (var属性的源){ 如果(source.hasOwnProperty(财产)){ var值=https://www.yisu.com/zixun/source[属性]; 如果(typeof值==="数量" | | typeof值===安级? | | typeof值===跋笳鳌? | | typeof价值==="字符串" | | typeof价值==="函数" | | typeof价值==="定义" | |值===null) 目标[属性]=价值; else if (typeof值===岸韵蟆?{//如果源对象在对象缓存中存在,就用对象克隆缓存中的值赋值 var指数=this.objKeyCache.indexOf(价值); 如果指数>=0) 目标[属性]=this.objValueCache(指数); 其他{ 目标[属性]=?寺?价值); } } 其他的 把“未知数据类型”+ (typeof价值); } } 返回目标; };/* * *创建副本 * @param{一}来源 */函数createEctype(源){ var目标={}; 如果(Array.isArray(源)) 目标=[]; this.objKeyCache.push(源); this.objValueCache.push(目标); 返回目标; } var newObject=this.clone(源);//释放缓存,防止内存溢出 这一点。objKeyCache=[]; 这一点。objValueCache=[]; 返回newObject; }
执行测试:
===newa;//错误 newa===newa。a4[0]//真实的 newa===newa.b.a;//正确的===newa.a4 [0];//错误 一个===newa.b.a;//错误