目录
一、递归函数
1.什么是递归函数?
递归函数是指在函数体内调用自身的函数。递归函数通常用于解决可以被拆分为相同问题的子问题的情况,每次调用函数都会处理一个更小的子问题,直到达到递归的终止条件。
2.示例说明:
使用递归函数计算一个数的阶乘:
function factorial(n) {
// 终止条件
if (n === 0) {
return 1;
}
// 递归调用
return n * factorial(n - 1);
}
console.log(factorial(5)); // 输出 120
// 计算5!
3.注意事项:
1.终止条件:递归函数必须定义一个或多个终止条件,以避免无限递归。在终止条件满足时,函数应该返回一个结果而不是继续递归调用。
2.递归调用:递归函数应该在递归的每一步中调用自身,但是参数应该是问题规模更小的子问题。
二、为什么需要深、浅拷贝?
不使用深、浅拷贝时,简单数据类型拷贝的是值,引用数据类型拷贝的是引用地址。(口决)
三、浅拷贝
1.什么是浅拷贝?
浅拷贝只复制了对象或数组的引用,而不是复制其内部的嵌套对象或数组。简单数据类型不受其拷贝对象的变化而影响被拷贝对象,引用数据类型变化则会影响拷贝源。(这意味着新对象或数组与原始对象或数组共享相同的内部数据,当修改其中一个时,另一个也会受到影响。)
2.几种常见的实现浅拷贝的方法:
1.展开运算符:使用展开运算符 … 可以快速进行浅拷贝。
// []数组
const originalArray = [1, 2, 3];
const newArray = [...originalArray];
console.log(newArray); // 输出 [1, 2, 3]
console.log(newArray === originalArray); // 输出 false
// {}对象
const originalObject = { name: 'John', age: 30 };
const newObject = { ...originalObject };
console.log(newObject); // 输出 { name: 'John', age: 30 }
console.log(newObject === originalObject); // 输出 false
2.Object.assign() 方法:使用 Object.assign() 方法可以将一个或多个源对象的属性复制到目标对象中。
const originalObject = { name: 'John', age: 30 };
const newObject = Object.assign({}, originalObject);
console.log(newObject); // 输出 { name: 'John', age: 30 }
console.log(newObject === originalObject); // 输出 false
3.缺陷:只能拷贝外层不能拷贝内层
浅拷贝只能拷贝最外层的引用地址,并不能拷贝内层的引用地址
修改最内层的数据 另一个也会改变,因为指针指向的的都是同一个内存地址
四、深拷贝
1.什么是深拷贝?
深拷贝是一种复制对象或数组的方法,它创建一个全新的对象或数组,并递归地复制原始对象或数组及其所有嵌套的对象或数组。这意味着新对象或数组与原始对象或数组完全独立,彼此之间没有任何引用关系。
2.几种常见的实现深拷贝的方法:
- JSON.parse() 和 JSON.stringify():使用 JSON.parse(JSON.stringify(object)) 可以实现深拷贝。这种方法将对象转换为 JSON 字符串,然后再将 JSON 字符串转换回对象,从而创建一个全新的对象。
const originalObject = { name: 'John', age: 30 };
const newObject = JSON.parse(JSON.stringify(originalObject));
console.log(newObject); // 输出 { name: 'John', age: 30 }
console.log(newObject === originalObject); // 输出 false
缺陷:这种方法有一些限制:它无法复制函数、正则表达式、日期对象等特殊类型的属性,并且会忽略原始对象的原型链上的属性。
2. 递归函数:可以编写递归函数来遍历对象或数组的属性,并递归地复制它们及其嵌套的属性。
obj = {
a: { name: 'abc' },
b: 2
}
function fn(obj) {
let newObj = {}
if(typeof obj !=='object') return '不是一个对象'
for (const key in obj) {
typeof obj[key] ==='object'? newObj[key]=fn(obj[key]): newObj[key]=obj[key]
}
return newObj
}
let newObj = fn(obj)
- 第三方库:lodash网址:http://lodash.net/ (中文网)
四、Set去重
1.什么是Set?
Set 是一种数据结构,用于存储唯一的值,即不允许重复值。Set 中的值可以是任何类型,包括原始类型和对象引用。
2.Set 的特点如下:
- 唯一性:Set 中的值是唯一的,不会存在重复值。
- 无序性:Set 中的值没有固定的顺序,不像数组有索引。
- 可迭代性:可以使用迭代器遍历 Set 中的值。
- 高效性:Set 提供了高效的添加.add()、删除.delete() 和 查找.has()获取 Set 的大小.size操作。
2.示例:
let arr = [1, 2, 3, 4, 5, 1, 2, 3];
// 5. 数字去重 [1,2,3,4,5]
console.log(new Set(arr))
console.log([...new Set(arr)]) // Array.from