发布于2021-03-10 19:04 阅读(509) 评论(0) 点赞(25) 收藏(4)
三种方法的形式存在一定的类似,但是也存在各个之间不相同的地方。
浅拷贝和深拷贝是用在对象(Object)或者数组(Array)这样的数据类型拷贝赋值时候的说法,而赋值操作也可以用在基础的数据类型,如Number、String等;
var aa = [ 1, 2, 3 ],bb;
bb = aa;
console.log(aa, bb); // aa = [1,2,3], bb = [1,2,3];
bb.push(5);//这里操作的是aa、bb指向的存储空间,所以aa、bb的值都发生了变化
console.log(aa, bb); // aa = [1,2,3,5], bb = [1,2,3,5];
bb[0] = 10;//这里操作的是aa、bb指向的存储空间,所以aa也发生了变化
console.log(aa, bb); // aa = [10,2,3,5], bb = [10,2,3,5];
bb = [ 2, 3, 4 ];//这里已经把bb指向了另一个数组,所以不会影响aa的值
console.log(aa, bb); // aa = [1,2,3,5], bb = [2,3,4];
ps:该浅拷贝的方法会覆盖原对象中相同属性的值,不需覆盖可以进行判断
//浅拷贝的方法
var extend = function(to, from) {
for (var property in from) {
//if(to.hasOwnProperty(property)) continue; //不需要覆盖可以执行该方法
if(!from.hasOwnProperty(property)) continue;
Object.defineProperty(to,property,Object.getOwnPropertyDescriptor(from,property));
}
return to;
};
var aa = { name: 'ou', language: [ 'chinese' ] };
var bb = {};
bb = extend(bb, aa);
console.log('aa---', aa, 'bb---', bb);
bb.name = 'ming';
bb.language[0] = 'english';
console.log('aa---', aa, 'bb---', bb);
ps:深拷贝涉及到比较复杂的数据类型的判断,
可遍历的:Object、Array 、Map、Set
不可遍历的:Bool、Number、String、Date、Error等
还有正则、克隆函数等
//简单对对象类型进行判断
var extend = function(to, from) {
for (var property in from) {
if (typeof from[property] === 'object') {
let cloneTarget = Array.isArray(from[property]) ? [] : {}; //进行判断,属性的值是对象还是数组
for (var key in from[property]) {
cloneTarget[key] = from[property][key];
}
to[property] = cloneTarget;
} else {
Object.defineProperty(to, property, Object.getOwnPropertyDescriptor(from, property));
}
}
return to;
};
作者:爱出汗
链接:http://www.qianduanheidong.com/blog/article/34310/8dd32b661b6330bed073/
来源:前端黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 前端黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-3
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!