JS高階--垃圾回收機制/閉包 closure/深淺拷貝
阿新 • • 發佈:2020-12-13
---垃圾回收機制
對於計算機:多餘的、無用的資料
儲存資料:計算機都會開闢空間來儲存組織,但無限開闢空間則會出現爆棧,影響效能
計算機會在適當的時候自動清理無用的資料,自動執行,並且不可見,引擎中有一個後臺程序被稱為“垃圾回收器”
回收方案: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.庫,框架、已經封裝好了克隆的方法