824笔记(闭包,递归,浅/深拷贝)

闭包

闭包:

有权访问另一个函数作用域中变量的函数,

一个作用域可以访问另外一个函数内部的局部变量

作用:延伸了变量的作用范围

特性:

变量或者参数不会被垃圾回收机制回收

函数套函数

内部函数可以直接访问外部函数的内部变量或者参数

优点:

变量长期驻扎在内存中

避免了全局变量污染

缺点:

常驻内存,增大了内存的使用量,使用不当会造成内存泄漏

递归

什么是递归

函数内部自己调用自己,该函数就是递归函数

必须有结束条件

拷贝

浅拷贝

// 浅拷贝 :只拷贝一层,更深层次对象级别的只拷贝引用
// 深拷贝   拷贝多层 每一级别的数据都会拷贝

var obj = {
    id:1,
    name:"andy",
    msg:{
        age:18
    }
}
var o ={}

// 第一种
// for(var k in obj){
//     // k 属性名  obj[k] 属性值
//     o[k] = obj[k]
// }
// console.log(o)
// o.msg.age =23
// console.log(obj)

// 第二种  合并对象Object.assign(target,source1,source2)
// target 目标对象  source1,source2 若干个源对象
// 实行的是浅拷贝

// var obj1 = {}
// var a ={a:1}
// var b={b:2}
// console.log(Object.assign(obj1,a,b))
// console.log(obj1)  //{a:1,b:2}

var obj1 = {a:{b:1}}
var obj2= Object.assign({},obj1)
obj1.a.b=3
console.log(obj2.a.b)

深拷贝

// 拷贝多层 每一级别的数据都会拷贝
var obj = {
    id:1,
    name:"andy",
    msg:{
        age:18
    },
    colors:['pink','red']
}
var o ={}

// 封装函数
function deepCopy(newobj,oldobj){
    for(var k in oldobj){
        // 判断我们的属性值属于那种数据类型
        var item=oldobj[k]
        // 判断这个值是否是数组
        if(item instanceof Array){
            newobj[k]=[]
            deepCopy(newobj[k],item)
        }else if(item instanceof Object){
            //判断是否为对象
             newobj[k]={}
             deepCopy(newobj[k],item)
        }else{
            // 属于简单数据类型
            newobj[k] = item
        }
    }
}


deepCopy(o,obj)
o.msg.age =89
console.log(obj,o)

posted on 2022-08-24 23:28  星野落  阅读(25)  评论(0)    收藏  举报

导航