一、浅拷贝

浅拷贝:一般指的是只拷贝对象的第一层,如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址

拓展运算符

  1. const originArr = ["a", [1, 2]]
  2. const cloneArr = [...originArr]
  3. cloneArr[0] = "b"
  4. cloneArr[1][1] = 1
  5. console.log(originArr) // ["a", [1, 1]]
  6. console.log(cloneArr) // ["b", [1, 1]]

Object.assign

  1. let originObj = { a: 'a', b: [1, 2]}
  2. let cloneObj = Object.assign({}, originObj)
  3. cloneObj.a = 'b'
  4. cloneObj.b[0] = 2
  5. console.log(originObj) // { a: 'a', b: [2, 2]}
  6. console.log(cloneObj) // { a: 'b', b: [2, 2]}

slice(0)

  1. const originArr = ["a", [1, 2]]
  2. const cloneArr = originArr.slice(0)
  3. cloneArr[0] = "b"
  4. cloneArr[1][1] = 1
  5. console.log(originArr) // ["a", [1, 1]]
  6. console.log(cloneArr) // ["b", [1, 1]]

concat()

  1. const originArr = ["a", [1, 2]]
  2. const cloneArr = originArr.concat()
  3. cloneArr[0] = "b"
  4. cloneArr[1][1] = 1
  5. console.log(originArr) // ["a", [1, 1]]
  6. console.log(cloneArr) // ["b", [1, 1]]

二、深拷贝

深拷贝:深拷贝会开辟一个新的堆和栈,两个对象属完成相同,但是对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性

JSON.stringify/parse

  1. // JSON.stringify 是将一个 JavaScript 值转成一个 JSON 字符串
  2. // JSON.parse 是将一个 JSON 字符串转成一个 JavaScript 值或对象
  3. const mySymbol = Symbol()
  4. const originObj = {
  5. name:'hhh',
  6. age:undefined,
  7. [mySymbol]:'mySymbol',
  8. sayHello:function(){
  9. console.log('Hello World')
  10. }
  11. }
  12. console.log(originObj) // {name: 'hhh', age: undefined, Symbol(): 'mySymbol', sayHello: ƒ}
  13. const cloneObj = JSON.parse(JSON.stringify(originObj))
  14. console.log(cloneObj) // {name: 'hhh'}

!!! undefined、function、symbol 会在转换成 JSON 字符串的过程中被忽略

递归 深拷贝

  1. function deepClone(source){
  2. const targetObj = source.constructor === Array ? [] : {}
  3. for(let keys in source){ // 遍历目标
  4. if(source.hasOwnProperty(keys)){
  5. if(source[keys] && typeof source[keys] === 'object'){
  6. targetObj[keys] = source[keys].constructor === Array ? [] : {};
  7. targetObj[keys] = deepClone(source[keys]);
  8. }else{ // 如果不是,就直接赋值
  9. targetObj[keys] = source[keys];
  10. }
  11. }
  12. }
  13. return targetObj;
  14. }