js中的递归函数、深拷贝、浅拷贝、set去重

一、递归函数

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.几种常见的实现深拷贝的方法:

  1. 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)
  1. 第三方库:lodash网址:http://lodash.net/ (中文网)

四、Set去重

1.什么是Set?

Set 是一种数据结构,用于存储唯一的值,即不允许重复值。Set 中的值可以是任何类型,包括原始类型和对象引用。

2.Set 的特点如下:

  1. 唯一性:Set 中的值是唯一的,不会存在重复值。
  2. 无序性:Set 中的值没有固定的顺序,不像数组有索引。
  3. 可迭代性:可以使用迭代器遍历 Set 中的值。
  4. 高效性: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

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值