2020-11-10(拷贝问题)
如何浅拷贝和深拷贝一个数组?
复制引用基础数据类型,都是拷贝对应的值。
复制引用复杂数据类型,都是拷贝对应的址。
//如果只是想修改的时候不影响原内容,就需要进行深拷贝。
如何实现浅拷贝?
1、手写浅拷贝
2、使用 Object.assign
3、使用数组API,如 concat 或者 slice 以及拓展运算符
使用Object.assign:
const obj1 = {
username: 'LiangJunrong',
skill: {
play: ['basketball', 'computer game'],
read: 'book',
},
girlfriend: ['1 号备胎', '2 号备胎', '3 号备胎'],
};
const obj2 = Object.assign({}, obj1);
obj2.username = 'jsliang'; // 修改基本类型
obj2.skill.read = 'computer book'; // 修改二层基本类型
obj2.skill.play = ['footboll']; // 修改二层引用类型
obj2.girlfriend = ['之前的都是瞎吹的!']; // 修改一层引用类型
console.log(obj1);
// { username: 'LiangJunrong',
// skill: { play: [ 'footboll' ], read: 'computer book' },
// girlfriend: [ '1 号备胎', '2 号备胎', '3 号备胎' ] }
console.log(obj2);
// { username: 'jsliang',
// skill: { play: [ 'footboll' ], read: 'computer book' },
// girlfriend: [ '之前的都是瞎吹的!' ] }
Object.assign 用于拷贝对象。它对于第一层来说,是完全拷贝;对于第二层及以上来说,是简单复制。
使用数组API:
Array.prototype.concat(target): concat() 是数组的一个内置方法,用户合并两个或者多个数组。这个方法不会改变现有数组,而是返回一个新
数组。 const b = [].concat(a)
Array.prototype.slice(start,end):slice() 也是数组的一个内置方法,该方法会返回一个新的对象。slice()不会改变原数组。 \
concat b = a.slice()
展开运算符:[...arr]可以得到一个浅拷贝新数组。
如何实现一个深拷贝?
1、手写深拷贝
2、JSON.parse(JSON.stringify())
3、第三方库 lodash,jQuery等。
JSON.parse(JSON.stringify())局限性:
不能存放函数或者undefined,否则会丢失函数或者undefined。
不用存放时间对象,否则会变成字符串形式。
不能存放RegExp,Error对象,否则会变成空对象。
不能存放NaN,infinity,-infinity,否则会变成null。
.....
JSON.parse():将字符串解析成对象。
JSON.stringify():将对象转成 json 字符串。
Lodash:
_cloneDeep(value):
例如:
npm i -S lodash
var _ = require('lodssh');
const obj1 = [
1,
'hello',
{name:'xx'},
[{name:'yy'}]
];
const obj2 = _.cloneDeep(obj1);
obj2[0]= 2;
obj2[1] = 'hi';
obj2[2].name = 'xx2';
obj2[3][0].name = 'xx2';
console.log(obj1);
console.log(obj2);//这里打印出来的值都不一样哦
jQuery方法:
使用 extend()进行深拷贝。
参考链接:https://juejin.im/post/6893314344751202317