浅拷贝:浅克隆之所以被称为浅克隆,是因为对象只会被克隆最外部的一层,至于更深层的对象,则依然是通过引用指向同一块堆内存.
1.第一种方法:
function shadowClone(o) { const obj = {}; for (let i in o) { obj[i] = o[i]; } return obj;}var oldObj = { a: 1, b: 3, c: [1, 3, 5, 7, 9]};var newObj = shadowClone(oldObj);复制代码
第二种:
var oldObj = { a: 1, b: 3, c: [1, 3, 5, 7, 9]};var newObj1 = Object.assign({}, oldObj);复制代码
深拷贝
深拷贝: 创建一个新的对象和数组,将原对象的各项属性的“值”(数组的所有元素)拷贝过来,是“值”而不是“引用”
// 深拷贝 // 获取类型 function getType(obj) { var toString = Object.prototype.toString; var map = { '[object Boolean]': 'boolean', '[object Number]': 'number', '[object String]': 'string', '[object Null]': 'null', '[object Undefined]': 'undefined', '[object Array]': 'array', '[object Function]': 'function', '[object RegExp]': 'regExp', '[object Date]': 'date', '[object Object]': 'object' } if (obj instanceof Element) { // 因为对不同标签,toString会返回对应不同标签的构造函数 return 'element'; } return map[toString.call(obj)]; } function deepClone(data) { var type = getType(data) var obj; if (type === 'array') { obj = [] for (var i = 0; i < data.length; i++) { obj.push(deepClone(data[i])) } } else if (type === 'object') { obj = {} for (var key in data) { obj[key] = deepClone(data[key]); } } else { obj = data; } return obj; } var oldObj = { a: 1, b: 2 } const newObj = deepClone(oldObj); const newObj1 = newObj.c = 4; console.log(oldObj, newObj) let oldData = [1, 2, 3, 4, 4]; const newData = deepClone(oldData); const newData1 = newData.push({ a: 4, b: 7 }); console.log(newData, '--->newData', oldData, '---->oldData');复制代码