JavaScript-高级篇,深拷贝与浅拷贝

264 阅读2分钟

「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」。

 递归

1. 什么是递归

递归:如果一个函数在内部可以调用其本身,那么这个函数就是递归函数。简单理解:函数内部自己调用自己, 这个函数就是递归函数

注意:递归函数的作用和循环效果一样,由于递归很容易发生“栈溢出”错误(stack overflow),所以必须要加退出条件return。

2. 利用递归求1~n的阶乘

//利用递归函数求1~n的阶乘 1 * 2 * 3 * 4 * ..n

 function fn(n) {

     if (n == 1) { //结束条件

       return 1;

     }

     return n * fn(n - 1);

 }

 console.log(fn(3));

Object.assign()与深拷贝浅拷贝

1. Object.assign()实现浅拷贝

浅拷贝

  • 拷贝出来的目标对象的地址和源对象的地址的内存空间是同一块空间

  • 让几个对象共用一个内存

Object.assign()方法用于将所有可枚举属性的值从一个或多个源对象分配到目标对象。它将返回目标对象。

Object.assign(target, ...sources)

  • 参数: target:目标对象。sources:源对象。
  • 返回值:返回目标对象。

2. 深拷贝

  • 克隆出一个对象,数据相同

  • 但是引用地址不同

浅拷贝和深拷贝的区别是什么?

  • 浅拷贝基本类型之前互不影响,引用类型其中一个对象改变了地址,就会影响另一个对象;
  • 深拷贝改变新对象不会影响原对象,他们之前互不影响。

最简单的深拷贝就是:

b = JSON.parse( JSON.stringify(a) )

不过这有局限性:

  • 无法复制函数
  • 原型链没了,对象就是object,所属的类没了。

但是简单,大多时候完全可以满足需求了

(1) 递归深复制对象

// 封装函数

function deepCopy(newobj, oldobj) {

    for (var k in oldobj) {

        // 判断我们的属性值属于那种数据类型

        // 1. 获取属性值  oldobj[k]

        var item = oldobj[k];

        // 2. 判断这个值是否是数组

        if (item instanceof Array) {

            newobj[k] = [];

            deepCopy(newobj[k], item)

        } else if (item instanceof Object) {

            // 3. 判断这个值是否是对象

            newobj[k] = {};

            deepCopy(newobj[k], item)

        } else {

            // 4. 属于简单数据类型

            newobj[k] = item;

        }

    }

};

(2) 使用 JSON 方法

JSON.parse(JSON.stringify(obj))