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

yizhihongxing

让我来详细讲解一下“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日

相关文章

  • 在nuxt中使用路由重定向的实例

    下面我将为你讲解在Nuxt中使用路由重定向的实例攻略。 什么是路由重定向? 路由重定向是浏览器在访问某个页面时,将页面地址自动跳转到另一个地址的技术,也叫URL重定向。 在Nuxt中,路由重定向可以通过使用 Nuxt.js 提供的插件实现,其中就包括 @nuxtjs/redirect-module 插件。 安装@nuxtjs/redirect-module插…

    JavaScript 2023年6月11日
    00
  • JavaScript闭包和作用域链的定义实现

    JavaScript闭包和作用域链的定义实现 什么是闭包? 在JavaScript中,闭包是指每个函数在创建时会生成一个自己的执行环境,这个执行环境可以访问到它自身定义的变量、参数,也可以访问父级的变量,而且这个执行环境可以一直存在,即使函数执行完,此时这个执行环境也不会被销毁。 简单来说,就是可以访问父级作用域的函数,创建出来的执行环境,这种执行环境中包含…

    JavaScript 2023年6月10日
    00
  • JavaScript装饰器函数(Decorator)实例详解

    JavaScript装饰器函数(Decorator)实例详解 理解装饰器 JavaScript装饰器是ES2016的新提案之一,它是一个函数,可以被用于修改类的行为。 一个装饰器可以被认为是一个具有固定签名(接受不同数量和类型的参数)的函数,它的第一个参数是被装饰的函数或类。 装饰器主要有两种应用:- 类装饰器: 用于修改类的定义- 方法装饰器: 用于修改类…

    JavaScript 2023年5月27日
    00
  • js拼接html字符串的注意事项

    JS拼接HTML字符串是Web开发中非常常见的方法,通常用于在页面中动态显示数据或者添加新的HTML元素。在拼接HTML字符串时,需要注意以下几点: 1. 字符串拼接方式 字符串拼接可以使用 + 连接符,也可以使用模板字符串。使用模板字符串可以在字符串内方便地插入变量或表达式,避免繁琐的字符串连接操作。示例如下: // 使用+连接符 const htmlSt…

    JavaScript 2023年5月28日
    00
  • ascii码表(二进制 十进制 十六进制)详细介绍

    ASCII码表(二进制、十进制、十六进制)详细介绍 什么是ASCII码表? ASCII码表(American Standard Code for Information Interchange)是一种用于将字符编码为数字的字符编码标准。它最初是在美国为电传打字机而设计的,但现在已经成为计算机系统和通信设备中使用的标准字符集。 ASCII码表的编码方式 ASC…

    JavaScript 2023年5月19日
    00
  • 详解JS判断页面是在手机端还是在PC端打开的方法

    下面详细介绍一下如何判断页面是在手机端还是在PC端打开,并提供两条示例说明。 方法一:使用UA判断 UA(UserAgent)是指HTTP请求头中的一部分,用于标识客户端的一些信息,比如用户的设备类型、浏览器型号等等。因此,我们可以通过判断UA中的关键字来确定页面访问者的设备类型。下面是实现的代码: const isMobile = /iPhone|iPad…

    JavaScript 2023年6月11日
    00
  • javascript demo 基本技巧

    首先,我们要了解何谓 JavaScript Demo,这其实是一种基于 JavaScript 语言开发的小型互动演示,它可以运行在浏览器端或 Node.js 等环境中,用于展示和演示某项特定功能或效果。 下面,我将分享一些 JavaScript Demo 开发的基本技巧,帮助大家更好地开发出功能强大且易维护的演示程序。 好的 JavaScript Demo …

    JavaScript 2023年5月27日
    00
  • nodejs将JSON字符串转化为JSON对象报错的解决

    当我们在Node.js中将JSON字符串转换成JSON对象时,有时候会遇到以下报错信息:SyntaxError: Unexpected Token 或 JSON.parse: unexpected character。这些错误信息一般是由于JSON字符串格式错误或编码格式错误导致。下面,我们就来详细讲解Node.js将JSON字符串转化为JSON对象报错的解…

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