0814
对象的深比较
class Box {
_data = {
a: 1,
b: 2,
c: {
a: 2,
b: 5,
d: {
a: 1,
b: 2,
c: [1, 2, 3],
},
},
};
constructor() {}
set data(value) {
if(this.compareData(value, this._data))return;
this.render();
this._data = value;
}
get data() {
return this._data;
}
render() {}
compareData(target, source) {
for (var prop in target) {
if (typeof target[prop] === "object" && target[prop] !== null) {
return this.compareData(target[prop], source[prop]);
} else {
if (target[prop] !== source[prop]) return false;
}
}
return true;
}
}
对象的深复制
function cloneObj(source,target){
if(target==undefined) target={};
var names=Object.getOwnPropertyNames(source);
for(var i=0;i<names.length;i++){
var desc=Object.getOwnPropertyDescriptor(source,names[i]);
if(typeof desc.value==="object" && desc.value!==null){
var obj;
switch(true){
case desc.value.constructor===Date:
obj=new Date(desc.value.toString());
break;
case desc.value.constructor===RegExp:
obj=new RegExp(desc.value.source,desc.value.flags);
break;
case HTMLElement.isPrototypeOf(desc.value.constructor):
obj=document.createElement(desc.value.nodeName);
break;
default:
obj=new desc.value.constructor()
}
Object.defineProperty(target,names[i],{
enumerable:desc.enumerable,
writable:desc.writable,
configurable:desc.configurable,
value:obj
});
cloneObj(desc.value,obj);
}else{
Object.defineProperty(target,names[i],desc)
}
}
return target;
}
闭包的概念和特点
- 概念
- 闭包是指有权访问另一个函数作用域中的变量的函数,
创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量
- 闭包是指有权访问另一个函数作用域中的变量的函数,
- 特点
- 函数嵌套函数
- 函数内部可以引用外部的参数和变量
- 参数和变量不会被垃圾回收机制回收
数组和链表的区别及各自优缺点
-
主要区别
-
数组的元素个数是固定的,而组成链表的结点个数可按需要增减
-
数组元素的存诸单元在数组定义时分配,链表结点的存储单元在程序执行时动态向系统申请:
-
数组中的元素顺序关系由元素在数组中的位置(即下标)确定,链表中的结点顺序关系由结点所包含的指针来体现。
-
对于不是固定长度的列表,用可能最大长度的数组来描述,会浪费许多内存空间。
-
对于元素的插人、删除操作非常频繁的列表处理场合,用数组表示列表也是不适宜的。若用链表实现,会使程序结构清晰,处理的方法也较为简便。
-
-
链表的优点
-
插入删除速度快
-
内存利用率高,不会浪费内存
-
大小没有固定,拓展很灵活。
-
-
链表的缺点
- 不能随机查找,必须从第一个开始遍历,查找效率低
-
数组的优点
- 随机访问性强
- 查找速度快
-
数组的缺点
-
插入和删除效率低
-
内存空间要求高,必须有足够的连续内存空间。
-
可能浪费内存
-
数组大小固定,不能动态拓展
-
-
数组的特点
- 在内存中,数组是一块连续的区域。
- 数组需要预留空间,在使用前要先申请占内存的大小,可能会浪费内存空间。
- 插入数据和删除数据效率低,插入数据时,这个位置后面的数据在内存中都要向后移。
- 随机读取效率很高。因为数组是连续的,知道每一个数据的内存地址,可以直接找到给定地址的数据。
- 不利于扩展,数组定义的空间不够时要重新定义数组。
-
链表的特点
- 在内存中可以存在任何地方,不要求连续。
- 每一个数据都保存了下一个数据的内存地址,通过这个地址找到下一个数据。
- 增加数据和删除数据很容易。
- 查找数据时效率低,因为不具有随机访问性,所以访问某个位置的数据都要从第一个数据开始访问,然后根据第一个数据保存的下一个数据的地址找到第二个数据,
- 不指定大小,扩展方便。链表大小不用定义,数据随意增删。
柯里化有什么作用?
- 减少代码冗余,也能增加可读性