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日

相关文章

  • JS数据类型分类及常用判断方法

    JS数据类型分类及常用判断方法 数据类型分类 JavaScript有7种数据类型,分别为: 原始类型(primitive): undefined null boolean number string symbol(ES6新增) 引用类型(object): Object Array Function Date RegExp Error Math JSON 常用…

    JavaScript 2023年6月10日
    00
  • js中apply和call的理解与使用方法

    下面是关于“js中apply和call的理解与使用方法”的完整攻略: 一、概述 在 JavaScript 中,call() 和 apply() 都是 Function 原型对象上的方法,主要用于改变函数运行时的上下文对象(即 this 指向)。 在使用时,两者的区别主要在于传递参数的方式不同。call() 接收的是一个参数列表,而 apply() 接收的是一…

    JavaScript 2023年6月10日
    00
  • 原生js 实现表单验证功能

    下面是关于“原生js实现表单验证功能”的完整攻略: 目录: 需求分析和实现思路 HTML结构布局 JS代码实现 示例说明 需求分析和实现思路 表单验证功能是Web开发中必不可少的功能之一,实现表单验证的方法有很多种,包括使用第三方库(如jQuery、Bootstrap等),也可以使用原生的JS来实现。下面是一个原生JS实现表单验证的基本思路: 获取表单元素。…

    JavaScript 2023年6月10日
    00
  • asp javascript值的互相传递方法

    ASP是一种服务器端脚本语言,而JavaScript则是一种客户端脚本语言,它们可以通过不同的方式进行值的互相传递。以下是几种常见的方法: 在URL中传递数据 URL中可以包含参数,我们可以将ASP页面中的变量作为参数传递,然后通过JavaScript解析URL,获取参数值。例如: ASP页面中的代码: <% Dim name name = &quot…

    JavaScript 2023年6月11日
    00
  • Three.js 进阶之旅:页面平滑滚动-王国之泪 ?

    声明:本文涉及图文和模型素材仅用于个人学习、研究和欣赏,请勿二次修改、非法传播、转载、出版、商用、及进行其他获利行为。 摘要 浏览网页时,常被一些基于鼠标滚轮控制的页面动画所惊艳到,比如greensock 官网这些 showcase 案例页面就非常优秀,它们大多数都是使用 Tween.js、gasp 及 greensock 提供的一些动画扩展库实现的。使用 …

    JavaScript 2023年5月6日
    00
  • 基于原生JavaScript实现SPA单页应用

    基于原生JavaScript实现SPA单页应用攻略 简介 单页应用(Single Page Application,SPA)是一种基于Web浏览器的应用程序,整个应用程序只有一个HTML文件,页面切换时通过ajax与后端进行数据交互,然后动态更新Dom元素,从而实现页面的切换。 原生JavaScript是指不依赖第三方框架或库,只使用纯JavaScript进…

    JavaScript 2023年6月11日
    00
  • JavaScript原型对象、构造函数和实例对象功能与用法详解

    JavaScript原型对象、构造函数和实例对象功能与用法详解 前言 在讲解 JavaScript 原型对象、构造函数和实例对象之前,我们需要先了解几个概念: 属性:包括原型对象和实例对象的属性,以及函数对象的属性 方法:包括原型对象和实例对象的方法,以及函数对象的方法 原型:每个 JavaScript 对象都有一个原型对象,用于继承属性和方法 构造函数:用…

    JavaScript 2023年5月27日
    00
  • JavaScript File API文件上传预览

    下面是关于“JavaScript File API文件上传预览”的完整攻略。 什么是JavaScript File API文件上传预览? JavaScript File API 文件上传预览是浏览器API之一,主要用于在浏览器中的上传文件操作中,可以通过JavaScript获取文件内容并展示到网页上,给用户更加直观的展示效果。 实现文件上传预览的步骤 1. …

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