js-克隆(浅克隆 & 深克隆)
js-克隆
浅克隆
- 浅克隆的对象的引用值是拷贝对象里的引用,这两个对象里面的引用(如对象里的数组或者内嵌对象)指向的地方是一致的。
var obj = {
name:"chen",
age:18,
gender:"female",
card:['visa','cb'],
wife:{
name:'abc',
son:{
name:'hehe'
}
}
};
var obj1 = {
};
function clone(origin,target){
for(var prop in origin){
if(origin.hasOwnProperty(prop)){
target[prop] = origin[prop];
}
}
return target;
}
clone(obj,obj1);
obj1.name = 'ge';
console.log(obj1.name);//ge
console.log(obj.name);//chen
obj1.card.push("abc");
console.log(obj.card);//['visa','cb','abc'];因为浅克隆的对象的引用值是拷贝对象里的引用,这两个对象的card指向的地方是一致的。
深克隆
这两个对象里的引用的独立拷贝的,不指向同一个地方。
深克隆
- 思路方法:
- 遍历对象
- 判断是不是原始值 typeof() object, instanceof, toString(推荐), constructor
- 判断是数组还是对象
- 建立相应的数组或对象
- 递归
function deepClone(origin, target){
var target = target || {};
var toStr = Object.prototype.toString;
var arrStr = '[object Array]';
for (var prop in origin){
if(origin.hasOwnProperty(prop)){
if(origin[prop] !== null && typeof(origin[prop]) == 'object'){
// if(toStr.call(origin[prop]) == arrStr){
// target[prop] = [];
// }else{
// target[prop] = {};
// }
target[prop] = (toStr.call(origin[prop])==arrStr) ? [] : {};
deepClone(origin[prop],target[prop]);
}else{
target[prop] = origin[prop];
}
}
}
return target;
}
deepClone(obj,obj1);
obj1.card.push("abc");
console.log(obj.card);//['visa','cb'];这两个对象里的引用的独立拷贝的,不指向同一个地方。
分类:
JavaScript
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南