1. 程式人生 > 實用技巧 >JS高階--垃圾回收機制/閉包 closure/深淺拷貝

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.庫,框架、已經封裝好了克隆的方法