JS高级--垃圾回收机制/闭包 closure/深浅拷贝

---垃圾回收机制

对于计算机:多余的、无用的数据

存储数据:计算机都会开辟空间来存储组织,但无限开辟空间则会出现爆栈,影响性能

计算机会在适当的时候自动清理无用的数据,自动执行,并且不可见,引擎中有一个后台进程被称为“垃圾回收器”

回收方案:1.标记清除 (栈) 2.引用计数(切断引用 计数为0 回收)

-----闭包 closure

闭包作用:原本应该清理的数据,由于还有引用(使用),导致该销毁的数据没有被销毁

对闭包的概念的描述不尽相同:

(网站)MDN:函数和对其周围状态的引用捆绑在一起构成闭包,闭包可以让你从内部函数访问外部函数作用 域,每当函数被创建,就会在函数生成时生成闭包。

(书籍)javaScript高级程序设计:闭包是指有权访问另一个作用域中的变量的函数

广义:所有函数都会生成闭包,因为只要有函数,就有SC(作用域链)

狭义:函数的嵌套,内部函数在访问外部函数作用域,内部函数在自身以外被调用

-----深浅拷贝

浅拷贝:旧的数据改变,拷贝的新内容跟随改变,复制的是地址

let arr=[1,2,3];
let newArr = arr;
console.log(arr); //[1,2,3]
console.log(newArr); //[1,2,3]
arr[0] ='a';
console.log(arr); //['a',2,3]
console.log(newArr); //['a',2,3]

深拷贝:把旧堆上的数据重新存在新堆上 一个数据的改变不影响另一个数据

数组深拷贝的方法(9种):数组的方法返回的就是新数组

1.for
2.for..of
3. ...    let arr = [1, 2, 3]; let newArr = [...arr];
4.concat  newArr = [].concat(arr)
5.map    newArr = arr.map(item => item)
6.slice  newArr = arr.slice(0,3);
7.filter
8.object.assign(newArr,arr)
9.JSON

对象深拷贝的方法(5种):

1.for  in
    let zsObj ={
       name:'zhansan',
          age:18
      }
      let newZs ={};
      for (let key in zsObj){
          newZs[key] = zsObj[key];
      } 
 2.Object.keys
   let newZs = {};
        let arr = Object.keys(zsObj);
        for (let item of arr) {
            newZs[item] = zsObj[item];
        }
  3. ... 
     let zsObj = {
            name: 'zhansan',
            age: 18
        }
        let newZs = { ...zsObj };
  4.Object.assign(newZs, zsObj)
    let zsObj = {
                name: 'zhansan',
                age: 18
            }
        let newZs ={};
        Object.assign(newZs, zsObj)
   5.JSON
   let zsObj = {
            name: 'zhansan',
            age: 18
        }
        let obj = {};
        obj =JSON.stringify(zsObj);
        let newZs = JSON.parse(obj);

嵌套:二维数组,多维数组

嵌套对象,多个嵌套对象 有专门的拷贝框架,直接调用

深拷贝应该考虑哪些问题:
    1.递归考虑爆栈
    2.对象方法是否要拷贝,正则。JOSN能够保存的数据类型,不包括函数,undefined。data
    3.业务范畴,不能脱离业务场景
    4.库,框架、已经封装好了克隆的方法

  

 

 

 

 

 

posted @ 2020-12-13 21:56  瓜豆のO泡  阅读(135)  评论(0)    收藏  举报