概括
![](https://i-blog.csdnimg.cn/blog_migrate/6e42bff267c39f9107786154d5fc2fea.png)
浅拷贝
let obj1 = { a: 0, b: { c: "hello" } }
let obj2 = Object.assign({}, obj1)
obj1.a = 1
obj1.d = '2'
obj1.b.c = '你好'
console.log(obj1); // { a: 1, b: { c: '你好' }, d: 2 }
console.log(obj2); // { a: 0, b: { c: '你好' } }
const arr = ['a', 'b', 'c']
const arr1 = arr.slice(0)
arr[1] = 'd'
console.log(arr) // ['a', 'd', 'c']
console.log(arr1) // ['a', 'b', 'c']
const arr = ['a', 'b', {a: 'd'}]
const arr1 = arr.concat()
arr1[2].a = '1'
console.log(arr) // ['a', 'b', {a:''1'}]
console.log(arr1) // ['a', 'b', , {a:''1'}]
//与concat方法差不多 这个还好读
const arr = ['a', 'b', {a: 'd'}]
const arr1 = [...arr]
arr1[2]['b'] = 'b'
arr1[0] = '1'
console.log(arr) //['a', 'b', {a:''d', 'b': 'b'}]
console.log(arr1) //['1', 'b', {a:''d', 'b': 'b'}]
const obj = {a: '1', d: [0]}
const obj2 = {...obj}
obj.c = 'a'
obj.d[0] = '1'
console.log(obj) // {a: '1', c: 'a', d: ['1']}
console.log(obj2) // {a: '1', d: ['1']}
深拷贝
function deepClone(obj) {
if(obj == null || typeof obj != 'object') {
return obj
}
if(Object.prototype.toString.call(obj) == '[object Date]') {
return new Date(obj)
}
if(Object.prototype.toString.call(obj) == '[object RegExp]') {
return new RegExp(obj)
}
if(Object.prototype.toString.call(obj) == '[object Undefined]') {
return new Error(obj)
}
let objClone = Array.isArray(obj) ? [] : {}
if(obj && typeof obj == 'object') {
for(let k in obj) {
if(obj.hasOwnProperty(k)) {
if(typeof obj[k] == 'object') {
objClone[k] = deepClone(obj[k])
} else {
objClone[k] = obj[k]
}
}
}
}
return objClone
}
const $ = require('jquery')
const obj = {
a: '1',
b: '2',
c: {
name: 'a'
}
}
const obj2 = $.extend(true, {}, obj)
console.log(obj.c === obj2.c) //false
const _ = require('lodash')
const obj = {
a: '1',
b: '2',
c: {
name: 'a'
},
}
const obj1 = _.cloneDeep(obj)
obj1.c.name = 'b'
console.log(obj) // {a: '1', b: '2', c: {name: 'a'}}
console.log(obj1) // {a: '1', b: '2', c: {name: 'b'}}
const obj = {
a: '1',
b: '2',
c: {
name: 'a'
}
}
const obj2 = JSON.parse(JSON.stringify((obj)))
console.log(obj.c === obj2.c) //false