一、闭包:
一个函数中嵌套了一个函数,内层函数可以访问外部函数的变量。
怎么用到闭包呢?
有的时候想获取到局部变量,正常情况下是获取不到的,这个时候就可以使用闭包来获取。
闭包可以封装对象的方法和私有属性,vue中的data就是一种闭包形式。
闭包作为回调函数,可以实现函数的复用。
优点:
可以长期驻扎在内存中,重复使用函数,不会造成内存污染
缺点:
函数中的变量都被保存在内存中,内存消耗很大,网页会发生性能问题,内存泄露的情况,所以不能滥用闭包。解决方式是在退出函数之前,把所有不需要的变量全部删除。
二、深拷贝 浅拷贝
1.浅拷贝: 将原对象的引用直接赋给新对象,新对象只是原对象的一个引用,而不复制对象本身,新旧对象还是共享同一块内存
2.深拷贝: 创建一个新的对象和数组,将原对象的各项属性的“值”(数组的所有元素)拷贝过来,是“值”而不是“引用”,新对象跟原对象不共享内存,修改新对象不会改到原对象
深拷贝拷贝的是值,浅拷贝拷贝的是地址
// 基本数据类型复制的是值 深拷贝
let num = 10;
let str = 'aaa';
let num2 = num;
num2 = 20;
console.log(num,num2);//10 , 20
// 引用数据类型复制的是地址 浅拷贝
let arr = [1,2,3]
let arr2 = arr;
arr[1]='aa';
console.log(arr2,arr);// [1, "aa", 3] , [1, "aa", 3]
基本数据类型存在栈中 ,引用对象类型存在堆中
数组深拷贝的方法:1.JSON.parse(JSON.stringify( ) ) 2.concat 3.展开运算符...
对象深拷贝的方法:1.JSON.parse(JSON.stringify( ) ) 2.用递归实现
递归方法:
// 递归实现对象的深拷贝
// 递归就是自身调用自身
function deepcopy(obj) {
let obj2 = {}; //保存拷贝之后的东西
for (const key in obj) {
// instanceof是判断数据类型的
if (obj[key] instanceof Object) {
// console.log(obj[key]);
obj2[key] = deepcopy(obj[key]);
// console.log(obj2[key]);
} else {
// console.log(obj[key]);
obj2[key] = obj[key];
}
}
return obj2;
}
let data = {
name: "小明",
friend: {
name: "小强",
},
};
let data2 = deepcopy(data);
三.原型相关的
1. prototype 显式原型
每个函数都有一个 prototype 属性,被称为显式原型,里面包含了这个构造函数公共的方法
2. \_ _proto_ 隐式原型
每个实例对象都会有\_ _proto_ _属性,其被称为隐式原型
每一个实例对象的隐式原型\_ _proto_ _属性指向自身构造函数的显式原型 prototype
3. constructor
每个 prototype 原型都有一个 constructor 属性,指向它关联的构造函数。
4. 原型链
获取对象属性或者方法的时候,如果对象本身没有这个属性,那就会去他的原型\_ _proto_ _上去找,如果还查不到,就去找原型的原型,一直找到最顶层(Object.prototype)为止。Object.prototype 对象也有_ _proto_ \_属性值为 null。
四、ajax相关的