JS面试题中深拷贝的实现讲解

让我来详细讲解一下“JS面试题中深拷贝的实现讲解”的完整攻略。

什么是深拷贝

深拷贝是创建一个新的对象,复制原始数据的所有属性,并且递归地复制该对象的所有属性,原始对象中的所有嵌套对象也被递归复制,即所有的嵌套对象都得到相同的值的一个全新的独立的拷贝,与原始对象没有任何联系。

深拷贝的实现

实现方式

  • 递归拷贝
  • JSON.parse && JSON.stringify

递归拷贝

递归拷贝对象

function deepClone(obj) {
    // 判断是否是对象或者数组
    if (typeof obj !== 'object' || obj === null) {
        return obj
    }
    // 判断是数组还是对象
    const newObj = Array.isArray(obj) ? [] : {}
    for (let key in obj) {
        newObj[key] = deepClone(obj[key])
    }
    return newObj
}

递归拷贝函数

function fnDeepClone(obj) {
    // 判断是否可执行
    if (typeof obj !== 'function') {
        return obj
    }
    // 判断是箭头函数还是普通函数
    let fn = obj.toString().match(/function\s*([^\(]*)\(/);
    let result = new Function(`return ${obj.toString()}`)();
    if (fn) {
        Object.defineProperty(result, 'name', { value: fn[1] });
    }
    return result;
}

JSON.parse && JSON.stringify

使用 JSON.stringify 将对象序列化为字符串,再用 JSON.parse 将字符串再解析回对象,由于 JSON 中的所有值都只能是对象,数组,字符串,数字,true,false,null,所以如果对象中有函数,undefined 这样无法被序列化的对象时,这种方法就不太可行了,实际应用中需要注意。

function deepClone(obj) {
    return JSON.parse(JSON.stringify(obj))
}

支持类型

  • 数组
  • 对象
  • 嵌套的数组、对象
  • 嵌套的函数

代码示例

递归拷贝示例

const obj = {
    a: 1,
    b: [1, 2, 3],
    c: {
        d: 2,
        e: {
            f: function () {
                console.log('f');
            }
        }
    }
}

const newObj = deepClone(obj)
console.log(newObj) // {a: 1, b: [1, 2, 3], c: {…}}
newObj.a = 2
newObj.b.push(4)
newObj.c.e.f = null
console.log(obj) // {a: 1, b: [1, 2, 3], c: {…}}
console.log(newObj) // {a: 2, b: [1, 2, 3, 4], c: {…}}

JSON.parse && JSON.stringify示例

const obj = {
    a: 1,
    b: [1, 2, 3],
    c: {
        d: 2,
        e: {
            f: function () {
                console.log('f');
            }
        }
    }
}

const newObj = deepClone(obj)
console.log(newObj) // {a: 1, b: [1, 2, 3], c: {…}}
newObj.a = 2
newObj.b.push(4)
newObj.c.e.f = null
console.log(obj) // {a: 1, b: [1, 2, 3], c: {…}}
console.log(newObj) // {a: 2, b: [1, 2, 3, 4], c: {…}}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS面试题中深拷贝的实现讲解 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 微信小程序实战之自定义模态弹窗(8)

    关于“微信小程序实战之自定义模态弹窗(8)”,我将从以下几个方面进行详细讲解: 创建自定义模态弹窗组件 在需要使用的页面中引入自定义组件 调用自定义组件并传递参数 示例说明 1. 创建自定义模态弹窗组件 创建自定义组件有两种方式,一种是使用 wepy 进行开发,另一种是使用 原生 小程序开发方式。下面是使用 原生 小程序开发方式创建自定义模态弹窗组件: 首先…

    JavaScript 2023年6月11日
    00
  • JavaScript截取、切割字符串的技巧

    那么首先我们需要了解一下JavaScript中用于截取和切割字符串的几个方法。 substring(startIndex, endIndex): 截取字符串中从startIndex(包含)到endIndex(不包含)的部分,返回一个新的字符串。 substr(startIndex, length): 截取字符从startIndex(包含)开始的length个…

    JavaScript 2023年5月19日
    00
  • 浅谈TypeScript3.7中值得注意的3个新特性

    首先,让我们先简单介绍一下TypeScript。TypeScript是微软开发的一种超集编程语言,它是JavaScript的扩展,可以增加静态类型、接口、类、命名空间等特性,将JavaScript打造成强类型的脚本语言。 TypeScript3.7是最新的版本,其中有三个新特性值得我们关注。 1.声明只读数组和元组 在TypeScript 3.7中,我们可以…

    JavaScript 2023年5月27日
    00
  • Java返回可变引用对象问题整理

    让我来详细讲解一下Java中返回可变引用对象问题的完整攻略。 什么是可变引用对象 在Java中,一个类分为基本类型和引用类型两种类型。基本类型的数据在赋值时直接复制了值本身,不会影响到原来的数据;而引用类型则是在赋值时复制的是引用,这个引用指向的是真正的数据空间。当一个引用类型变量被赋值时,它指向的地址就发生了改变,但是它所指向的对象的地址没有改变。 那么,…

    JavaScript 2023年6月11日
    00
  • three.js绘制地球、飞机与轨迹的效果示例

    下面是关于”three.js绘制地球、飞机与轨迹的效果示例”的完整攻略。 简介 three.js是一款基于WebGL的JavaScript 3D渲染库,可以用来制作3D场景、动画等效果。在制作3D场景中,绘制地球、飞机与轨迹是比较常见的需求。本文将讲述如何使用three.js实现绘制地球、飞机与轨迹效果。 步骤 1. 准备工作 首先,我们需要引入three.…

    JavaScript 2023年6月11日
    00
  • 浅谈javascript中return语句

    当在JavaScript中编写函数时,有时需要将函数的结果返回到调用函数的地方。这就是使用return语句的情况。 return语句允许我们从函数中返回一个值,并将其放回到调用函数的行。在本文中,我们将讨论JavaScript中的return语句及其用法。 什么是return语句 JavaScript中的return语句指定函数应该返回的值。如果一个函数没有…

    JavaScript 2023年6月11日
    00
  • 详解Javacript和AngularJS中的Promises

    详解Javascript和AngularJS中的Promises 什么是Promise Promise是一种解决异步编程的方法。在Javascript中,由于大量的异步操作(如网络请求、定时器等),往往会产生回调地狱(callback hell)的问题,而Promise可以很好地避免这种问题。 Promise中包含3种状态:pending、fulfilled…

    JavaScript 2023年5月28日
    00
  • Javascript动画效果(4)

    下面详细讲解“Javascript动画效果(4)”的完整攻略。 JavaScript动画效果(4) 什么是JavaScript动画? JavaScript动画是指使用JavaScript代码控制DOM元素的变化,实现动态效果的技术。 JavaScript动画的优点 相比于CSS动画,JavaScript动画具有以下优点: 更加灵活,可以控制更加复杂的动画效果…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部