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.库,框架、已经封装好了克隆的方法

浙公网安备 33010602011771号