首先js分基本类型和引用类型

基本类型:Number,String,Boolean,Null,undefined

引用类型:函数,对象,数组

let a = 1
  let b = a
  a = 2

基本类型key,value存储在栈内存中,当b=a时,会开辟新的内存,修改a不会影响b

  let a = [1, 2, 3, 4]
  let b = a
  a[0] = 2

引用类型key存储在栈内存中,value存储在堆内存中,但是会有一个引用的地址指向堆内存中的值,修改a会影响b  

浅拷贝的实现方式

简单粗暴的赋值

  let simpleClone = (obj) => {
    let cloneObj = {}
    for (let i in obj) {
      cloneObj[i] = obj[i]
    }

    return cloneObj
  }

  let obj = {
    name: 'susan',
    age: 20,
    gameCharacters: {
      name: 'apple',
      age: 1
    },
    arr: [1, 2, 3],
    say () {
      console.log(`my name is: ${this.name}`)
    }
  }
  let obj2 = simpleClone(obj)

es6提供了Object.assign

  let obj2 = Object.assign({}, obj)

深拷贝的方法

利用递归实现

  let deepClone = (source, target) => {
    target = target || {}
    for (let k in source) {
      if (typeof source[k] === 'object') {
        target[k] = source[k].constructor === Array ? [] : {}
        deepClone(source[k], target[k])
      } else {
        target[k] = source[k]
      }
    }
    return target
  }

转成json然后转换回来

JSON.parse(JSON.stringify(obj))

使用jquery的$.extend()方法

使用lodash的cloneDeep方法

posted on 2018-11-29 20:16  苏荷酒吧  阅读(89)  评论(0)    收藏  举报