js对象的深拷贝的方法
定义: 创建一个新对象,将原始对象从内存中完整的拷贝一份出来,从堆内存中开辟了一个新的区域存放新对象,新对象和原始对象完全没关系
var person = {
name: 'mangoyi',
age: 23,
eduations: ['primary', 'middle', 'university'],
skill: {
javascript: 'well',
css: 'good',
html: 'well'
}
};
- JSON
// JSON 深拷贝
var jsonClonePerson = JSON.parse(JSON.stringify(person));
// 当对象中包含function方法时,深拷贝失败
var person = {
speak: function() {
console.log('go on')
}
}
var jsonClonePerson = JSON.parse(JSON.stringify(person)); // speak属性丢失
- Jquery extend
// jquery库
var extendClonePerson = $.extend(true, {}, person);
- lodash cloneDeep
// lodash库
var lodashClonePerson = _.cloneDeep(person);
- 原生JS
function cloneDeep(source) {
var target = Array.isArray(source) ? [] : {};
for (let key in source) {
if (typeof source[key] === 'object') {
target[key] = cloneDeep(source[key);
} else {
target[key] = source[key];
}
}
return target;
}
var cloneDeepPerson = cloneDeep(person);
js对象的浅拷贝的方法
定义:创建一个新对象,这个对象对原始对象属性值的一份拷贝。如果属性值是基本数据类型,拷贝的就是基本数据类型的值,如果属性是引用类型,拷贝的就是内存地址。所以新对象和原始对象依然引用同一个内存地址。
- Object.assign
Object.assign(target, source)方法将所有可枚举的值从一个或多个源对象复制到目标对象,将返回目标对象
var clonePerson = Object.assing({}, person);
- JS枚举
function clone(source) {
let target = Array.isArray(source) ? [] : {};
for(let key in source) {
target[key] = source[key]
}
}