其实js里的克隆跟生活里说的克隆是一样的。有一个本体,克隆出跟本体一摸一样的副体,当本体“受伤”时副体是不会“受伤”的,js的克隆也是如此。
来看下面代码
<script>
var benti = {
top: "铁头",
leg: "大长腿",
waist: "细腰",
hand: "小手",
};
console.log(
`本体有---${benti.top}、${benti.leg}、${benti.waist}、${benti.hand}`
);
</script>
<script>
var benti = {
top: "铁头",
leg: "大长腿",
waist: "细腰",
hand: "小手",
};
var futi = benti;
console.log(
`本体有---${benti.top}、${benti.leg}、${benti.waist}、${benti.hand}`
);
console.log(
`副体有---${futi.top}、${futi.leg}、${futi.waist}、${futi.hand}`
);
</script>
<script>
var benti = {
top: "铁头",
leg: "大长腿",
waist: "细腰",
hand: "小手",
};
var futi = benti;
benti.top = "本体的铁头受伤了"; //本体的头受伤了
console.log(
`本体有${benti.top}、${benti.leg}、${benti.waist}、${benti.hand}`
);
console.log(
`副体有${futi.top}、${futi.leg}、${futi.waist}、${futi.hand}`
);
</script>
<script>
var benti = {
top: "铁头",
leg: "大长腿",
waist: "细腰",
hand: "小手",
};
//浅克隆
function clone(oldObj) {
var newObj = {};
for (var key in oldObj) {
newObj[key] = oldObj[key];
}
return newObj;
}
var futi = clone(benti);
benti.top = "本体的铁头受伤了"; //本体的头受伤了
console.log(
`本体有---${benti.top}、${benti.leg}、${benti.waist}、${benti.hand}`
);
console.log(
`副体有---${futi.top}、${futi.leg}、${futi.waist}、${futi.hand}`
);
</script>
<script>
var benti = {
top: "铁头",
leg: "大长腿",
waist: "细腰",
hand: "小手",
};
//浅克隆
function clone(oldObj) {
//如果传进来的参数是null,那就返回一个null
if (oldObj == null) {
return null; //直接退出
}
//如果传进来的是原始类型值,就返回原始类型值
if (typeof oldObj != "object") {
return oldObj; //直接退出
} else {
var newObj = Array.isArray(oldObj) ? [] : {}; //不要直接创建对象,先使用三目运算符判断是创建数组还是对象
for (var key in oldObj) {
newObj[key] = oldObj[key];
}
return newObj; //返回新对象或数组
}
}
//克隆一个对象
var futi = clone(benti);
benti.top = "本体的铁头受伤了"; //本体的头受伤了
console.log(
`本体有---${benti.top}、${benti.leg}、${benti.waist}、${benti.hand}`
);
console.log(
`副体有---${futi.top}、${futi.leg}、${futi.waist}、${futi.hand}`
);
//参数为null
var boor = clone(null);
console.log(boor);
//参数为数字,字符串
var number = clone(12);
var string = clone("string");
console.log(number);
console.log(string);
//参数为数组
var arr = clone([1, 2, 3, 4, 5]);
console.log(arr);
</script>
输出结果
这样浅克隆就实现了。接下来看看什么是深克隆吧,深克隆跟浅克隆有什么区别呢?
既可以克隆第一级属性,如果某个属性又是一个内嵌的子对象,深克隆会进入子对象中,继续克隆内嵌子对象及其内容。
什么是内嵌的子对象呢?看下面的代码
var benti = {
top: "铁头",
leg: "大长腿",
waist: "细腰",
hand: "小手",
chuanzhe:{
yifu:"adds",
xiezi:"AJ",
kuzi:"boshilong"
}
};
对象benti中的chuanzhe就是内嵌的子对象,如果用浅克隆的方式克隆出来的副体是有问题的,因为对象存储是存在一个地址中,所以浅克隆是无法克隆内嵌的子对象,那深克隆是怎么实现的呢?是利用递归的思想来解决这个问题的,
看下面的代码
<script>
var benti = {
top: "铁头",
leg: "大长腿",
waist: "细腰",
hand: "小手",
chuanzhe: {
yifu: "adds",
xiezi: "AJ",
kuzi: "boshilong",
},
};
//深克隆
function clone(oldObj) {
//如果传进来的参数是null,那就返回一个null
if (oldObj == null) {
return null; //直接退出
}
//如果传进来的是原始类型值,就返回原始类型值
if (typeof oldObj != "object") {
return oldObj; //直接退出
} else {
var newObj = Array.isArray(oldObj) ? [] : {}; //不要直接创建对象,先使用三目运算符判断是创建数组还是对象
for (var key in oldObj) {
newObj[key] = clone(oldObj[key]); //如果属性有内嵌子对象就再次调用克隆函数 递归的思想
}
return newObj; //返回新对象或数组
}
}
//克隆一个对象
var futi = clone(benti);
benti.top = "本体的铁头受伤了"; //本体的头受伤了
console.log(benti);
console.log(futi);
//参数为null
var boor = clone(null);
console.log(boor);
//参数为数字,字符串
var number = clone(12);
var string = clone("string");
console.log(number);
console.log(string);
//参数为数组
var arr = clone([1, 2, 3, 4, 5]);
console.log(arr);
</script>
zplxwl 发表于 2020-5-19 15:30
666666666666666666
1467584 发表于 2020-5-20 09:57
66666666666666666666666666666666
yujq 发表于 2020-5-19 11:46
6666666666666666666666666
zplxwl 发表于 2020-5-19 15:30
666666666666666666
逆风TO 发表于 2020-5-18 17:34
你只管去努力,剩下的交给天意。
yujq 发表于 2020-5-19 11:46
6666666666666666666666666
zplxwl 发表于 2020-5-19 15:30
666666666666666666
1467584 发表于 2020-5-20 09:57
66666666666666666666666666666666
zplxwl 发表于 2020-5-19 15:30
666666666666666666
1467584 发表于 2020-5-20 09:57
66666666666666666666666666666666
yujq 发表于 2020-5-19 11:46
6666666666666666666666666
yujq 发表于 2020-5-19 11:46
6666666666666666666666666
zplxwl 发表于 2020-5-19 15:30
666666666666666666
manyihang 发表于 2020-5-18 17:12
6666666666666666666
大安 发表于 2020-5-18 17:41
感谢分享!
jsnoob 发表于 2020-5-18 23:02
加油加油加油!!!
耙丫丫 发表于 2020-5-18 15:22
66666666666666666666
大安 发表于 2020-5-18 17:41
感谢分享!
大安 发表于 2020-5-18 17:41
感谢分享!
jsnoob 发表于 2020-5-18 23:02
加油加油加油!!!
yujq 发表于 2020-5-19 11:46
6666666666666666666666666
manyihang 发表于 2020-5-18 17:12
6666666666666666666
jsnoob 发表于 2020-5-18 23:02
加油加油加油!!!
yujq 发表于 2020-5-19 11:46
6666666666666666666666666
manyihang 发表于 2020-5-18 17:12
6666666666666666666
大安 发表于 2020-5-18 17:41
感谢分享!
耙丫丫 发表于 2020-5-18 15:22
66666666666666666666
sdjadyhm 发表于 2020-5-18 15:10
66666666666666
黑马程序员啊 发表于 2020-5-20 10:30
6666666666666666666666666
zhaosongzhi 发表于 2020-5-21 17:05
6666666666666666666666666666666666
lzq123 发表于 2020-5-21 20:30
666666666666666666
零度☆黎明 发表于 2020-5-20 23:05
不错, 不错 .................. ..................
零度☆黎明 发表于 2020-5-20 23:05
不错, 不错 .................. ..................
零度☆黎明 发表于 2020-5-20 23:05
不错, 不错 .................. ..................
零度☆黎明 发表于 2020-5-20 23:05
不错, 不错 .................. ..................
零度☆黎明 发表于 2020-5-20 23:05
不错, 不错 .................. ..................
零度☆黎明 发表于 2020-5-20 23:05
不错, 不错 .................. ..................
hongping 发表于 2020-5-21 15:23
你开心就好啊
竹竹竹竹 发表于 2020-5-22 10:12
6666666666666666666666
黑马程序员啊 发表于 2020-5-20 10:30
6666666666666666666666666
mydorling11 发表于 2020-5-23 18:50
yum install net-tools
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |