深浅拷贝

73 阅读1分钟

浅拷贝

是基本数据类型,拷贝的是栈中的值

是复杂数据类型,拷贝的是栈中的地址,拷贝对象与被拷贝对象公用一个堆的地址

js

const obj={a:1, good:{name:'汉堡',eat{name:'汉堡'}} }

function foo(obj) { 
const newObj = {} 
for (let prop in obj) { 
    if (obj.hasOwnProperty(prop)) { 
    newObj[prop] = obj[prop] } } 
    return newObj }
    
 const newObj=foo(obj)

拓展运算符

const obj={a:1, good:{name:'汉堡',eat{name:'汉堡'}} }

const newObj={...obj}

Object.assign

const obj={a:1, good:{name:'汉堡',eat:{name:'汉堡'}} }

const newObj=Object.assogn({},obj)

slice

      const obj = [1, 3, 2, 4, 5, 8]
      const newObj = obj.slice()

深拷贝 栈中创建一个新的地址指向堆中新开辟的属性相同的新空间,且修稿一个对象的属性不会影响另一对象

拷贝对象

    const obj = {
      a: 1,
      good: {
        name: '汉堡',
        eat: {
          name: '汉堡',
          say: () => {
            return 'ohhhh'
          }
        }

      }
    }

JSON

缺点:会忽略symbol undefined function

      const newObj = JSON.parse(JSON.stringify(obj))

lodash 推荐

    const _ = require('lodash')
    const newObj = _.clone(obj)

简易递归

    const deepObj = (obj) => {
      const newObj = Array.isArray(obj) ? [] : {}
      for (const prop in obj) {
        if (typeof obj[prop] === 'object') {
          if (obj.hasOwnProperty(prop)) newObj[prop] = deepObj(obj[prop])
        } else {
          newObj[prop] = obj[prop]
        }
      } return newObj
    }
    const newObj = deepObj(obj)