深浅拷贝

88 阅读2分钟

深浅拷贝

  • 含义:通常是指将一个引用数据类型,拷贝到另外一个变量中,但是根据拷贝的方法不同展示出的效果也有差异。
  • 浅拷贝:将一份数据拷贝到另外一个变量中,修改第一层数据时不会相互影响,但是修改第二层数据时会互相影响。
  • 深拷贝:将一份数据拷贝到另外一个变量中,不管修改哪一层数据,两个对象之间都不会相互影响。
//浅拷贝
let obj = {
    name:'张三'age:18,
    info: {
    width:100,
    height:280
    }
}
let newObj = {}
for (let key in obj) {
    newObj[key] = obj[key]
}
newObj.age = 99
newObj.info.width = 999
console.log('newObj',newObj)
console.log('obj',obj)

//深拷贝
let obj = {
    name:'张三'age:18,
    info: {
    width:100,
    height:280
    }
}
let newObj = {}
function deepClone (target,origin) {
    for (let key in origin) {
    //根据遍历到的这个属性的属性值是什么类型,决定执行什么代码
        if (Object.prototype.toString.call(origin[key]) === '[object Object]') {
        //如果代码执行到这里说明是对象类型
        targer[key] = {}
        deepClone(target[key] ,origin[key])
        
        }
    }
}
newObj.age = 99
newObj.info.width = 999
console.log('newObj',newObj)
console.log('obj',obj)


函数的定义与调用

  1. 定义:
  • 在堆内存开一个空间
  • 将函数的函数体内的代码 保存到堆内存中
  • 将堆内存的地址保存在变量名(函数名),最后将这个变量名存储在栈内存中
  1. 调用:
  • 根据变量名(函数名)中的地址,找到对应的函数
  • 然后在调用栈中开一个新空间(函数的执行空间)
  • 在执行空间中 对函数的形参进行赋值
  • 在执行空间中 执行函数的代码
  • 销毁当前函数的执行空间

永不销毁的执行空间

  1. 正常书写一个函数
  2. 在这函数内 向外返回一个 引用数据类型
  3. 当满足上述条件时,这个函数的执行空间将不会被销毁
function fn () {
    const obj {
    name:'张三',
    age:18
    }
    return obj
}
const newObj = fn ()
console.log(newObj)

闭包

  1. 需要 直接 或者 间接的返回一个函数
  2. 内部函数需要访问 外部函数的局部变量
  • 好处:
  • 延长变量的生命周期,在函数外可以使用函数内的变量
  • 弊端:
  • 执行空间不会被销毁,如果大量使用会造成内存泄漏
function outter () {
    let a = 100
    let obj = {
    name:'函数',
    age:18
    }
    function inner() {
    return obj
    }
    return inner
}
const newFn = outter ()
let num = newFn ()
console.log(num)