目录
- 递归
- 面向对象
- 克隆
一、递归
1.1 基础
-
概念:递归本身是函数的一种编程技巧,函数调用自己。
-
作用:
- 解决部分的循环相关的问题,代码量更少
- 提供一种新的编程逻辑问题的思路
-
语法
function 函数名(){
函数名();//递归
}
函数名();
-
使用递归条件
- 要解决的问题是带有循环特性的,会重复触发。
- 要有明确递归结束的边界
let i =1;
function demo2(){
console.log(i);
if(i<100){//边界,不满足则退出递归
i++;
demo2();
}
}
demo2();
- 递归要使用的数据作为参数传递进去
1.2 递归使用流程
- 1.判断题目是否带有一定的规律
- 2.是否有明确的边界。比如一定次数,从某个数到1结束
- 3.满足前两个条件后就可以将规律用函数递归的方式来实现出来。
1.3 递归应用
- 兔子问题
时间/日期 | 第一个月 | 第二个月 | 第三个月 | 第四个月 | 第5个月 | 第6个月 |
---|---|---|---|---|---|---|
等于或超过三个月大的兔子 | 0 | 0 | 1 | 1 | 2 | 3 |
二个月大的兔子 | 0 | 1 | 0 | 1 | 1 | 2 |
一个月大的兔子 | 1 | 0 | 1 | 1 | 2 | 3 |
总数 | 1 | 1 | 2 | 3 | 5 | 8 |
- 鸡哥问题
时间/日期 | 7个村子后 | 第7个村子时 | 第6个 | 第5个 | 第4个 | 第3个 | 第2个 | 第1个 |
---|---|---|---|---|---|---|---|---|
剩余数量 | 1 | 4 | 10 | 22 | 46 |
- 规律:第n天和第n-1天的数量关系, f(n-1) =( f(n)+1)*2
二、Object
- 前提:所有的对象都有一些通用的api可以使用。这些api都是由Object类来提供的。
2.1 object 简介
- Object是JavaScript所有对象的祖先,可以理解为一个特殊 的数据结构(类),内部含有所有对象共用的api,方便开发者进行使用
2.2 常用api(第一部分)
名称 | 说明 |
---|---|
Object.create | 生成一个对象,可以指定祖先对象,可以设为null,表示没有组件。如果为null,那么Object所提供的通用api也不能用。api了解 |
Object.assign | 完成多个对象的合并,可以将一个对象的属性复制到另一个对象中。 |
Object.defineProperty | 修改或新增某个对象的指定属性,并可以设置该属性的读写特性 |
2.2.1 Object.create
-
作用:用于创建一个新的对象。
-
语法
let obj = Object.create(null);
-
区别
- 通过
object.create
生成的对象可能不能使用通用api - 常规
{}
对象可以使用通用 api
- 通过
-
目前可以新增对象的方式
- Object.crreate
{}
- new Object()
2.2.2 Object.assign:合并对象,也可以用于复制
-
作用:合并或复制对象
-
语法
Object.assign(target,source); 1. 复制 let obj = {name:"张三"}; let newObj = {}; Object.assign(newObj,obj);//将obj里的属性复制到obj中
- target:目标对象,即要合并或复制的对象
- source:源对象。用于合并或复制属性到target的对象,
2.2.3 Object.defineProperty
-
目的:用于修改或新增某个对象的一个属性,并能够设置改属性是否可读写。即更细节的控制属性。
-
语法
Object.defineProperty(要操作的对象,"属性名",{ value:'属性值', writable:true,//可写 })
2.3 浅克隆和深克隆(浅拷贝和深拷贝)
- 前提:目前 的对象复制只能复制基本类型的数据,而对象里的引用类型数据则不能直接复制。而将根据不同数据类型 的复制分为浅克隆和深克隆。
2.3.1 浅克隆
-
概念:浅克隆是指复制一个对象,但只复制了源对象的基本类型的数据,而引用类型数据并没有复制,只是拷贝了数据的内存地址,并没有复制引用类型数据本身。
-
实现 方式
- 扩展运算符
- Object.assign
-
例子代码:
let obj ={ name:"cxk", age:23, habbits:['rap','ball','dance'] }; //完成对象的复制 // let newObj ={...obj}; let newObj = Object.assign({},obj); //修改obj的属性进行测试 obj.name="鸡哥"; obj.habbits.push("jump") console.log(newObj);
2.3.2 深克隆
-
概念:针对一个引用类型数据的完全复制,包括对象里面的所有基本类型数据以及引用类型数据的复制。
-
方式
- 第一种:使用JSON.parse和JSON.stringify
- 第二种:递归
-
第一种
-
第二种:递归
- 对源数据进行forin遍历,如果遍历属性 的值是基本类型数据,则直接将同名属性以及数据赋值给新对象中。如果源对象某个属性是引用类型数据,那么就利用递归对该引用类型数据进行forin遍历处理。
let obj ={ name:"cxk", age:23, habbits:['rap','ball','dance'], address:{ city:'南京', area:'江宁区' } }; function copyObject(newObj,source){ for (const key in source) { if(Array.isArray(source[key])){ //要复制的是一个数组 newObj[key]=[...source[key]]; }else if(typeof source[key] =="object"){ //属性值是对象类型 newObj[key]={}; copyObject(newObj[key],obj[key]); }else{ //基本类型数据,直接复制 newObj[key] = source[key] } } } let newObj = {};//新对象 copyObject(newObj,obj); console.log(newObj);