JavaScript之深度克隆、多种实现方式、列举各种方式的优缺点、对象自有属性、拷贝、复制

这篇具有很好参考价值的文章主要介绍了JavaScript之深度克隆、多种实现方式、列举各种方式的优缺点、对象自有属性、拷贝、复制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


源数据

class Test {
    constructor() {
        this.a = 1;
        this.b = 2;
    }

    c() {
        console.log('c');
    }
};

Test.prototype.d = 1;
const obj = new Test();
obj.h = obj;

正统深克隆

// 循环引用的克隆
// 防止递归的无限执行
// 避免报错
// 避免内存泄漏
const cache = new WeakMap();

function orthDeepClone(value) {
    // 函数不需要克隆
    // 会进入此判断并直接返回
    if (typeof value !== 'object' || value === null) return value;
    // 判断缓存是否存在当前值
    // 有的话返回结果
    // 没有就继续往下执行
    if (cache.has(value)) return cache.get(value);

    // 创建数组或对象
    // 可以添加Map等其他对象
    const result = Array.isArray(value) ? [] : {};

    // 设置result的原型为value的原型
    // 如果不设置
    // 当克隆类的时候返回的是普通对象
    Object.setPrototypeOf(result, Object.getPrototypeOf(value));
    // 设置缓存
    cache.set(value, result);
    for (const key in obj) {
        // 不确定数据类型时使用
        // if (Object.hasOwnProperty.call(obj, key)) result[key] = orthDeepClone(obj[key]);

        // 确定数据类型时使用
        // 只克隆value的自有属性
        // 原型上的属性不参与克隆
        if (value.hasOwnProperty(key)) result[key] = orthDeepClone(obj[key]);
    }

    return result;
}

console.log(orthDeepClone(obj));
// Test {a: 1, b: 2, h: Test}

JSON深克隆

function JSONDeepClone(value) {
    return JSON.parse(JSON.stringify(value));
}

console.log(JSONDeepClone(obj));
// 报错
// Uncaught TypeError: Converting circular structure to JSON

JavaScript中,对象和数组是引用类型,当将一个对象或数组赋值给另一个变量时,它们实际上是共享同一块内存空间。这意味着对一个对象或数组的修改会影响到所有引用它的变量。
为了创建一个独立的副本,可以使用深克隆。JSON.stringify()方法将JavaScript对象转换为一个JSON字符串,然后使用 JSON.parse()方法将该字符串解析为一个新的JavaScript对象。通过这种方式,创建了一个完全独立的副本,对其中一个对象的修改不会影响到另一个对象。
需要注意的是,这种方法仅适用于可以被JSON表示的数据类型,例如对象数组字符串数字布尔值null。它不能复制函数正则表达式Date对象等特殊类型的值。
文章来源地址https://www.toymoban.com/news/detail-783196.html

到了这里,关于JavaScript之深度克隆、多种实现方式、列举各种方式的优缺点、对象自有属性、拷贝、复制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 防抖和节流及多种实现方式

    当用户在网页中进行操作时,如点击、滚动、输入等,往往会频繁地触发事件。如果每个事件都立即执行相应的函数,可能会导致性能问题和用户体验不佳,因为这些函数可能需要执行复杂的操作,如计算、网络请求等。 为了优化这种情况,我们可以使用防抖和节流来限制函

    2023年04月24日
    浏览(48)
  • Linux实现查看文件内容的多种方式

    目录 1、more:分屏显示文件内容。 2、less:文本内容查看器 3、head -n:显示文件前n行到终端 4、tail -n:显示文件后n行到终端 5、实现实时查看文件内容(追踪文件)         除了使用vi/vim 编辑器查看文件内容和使用cat命令将文件所有内容展示到终端上以外,还有多种方式。

    2024年02月12日
    浏览(48)
  • SpringBoot实现文件下载的多种方式

    1.1 下载文件

    2024年02月06日
    浏览(40)
  • vue实现导出excel的多种方式

    在Vue中实现导出Excel有多种方式,可以通过前端实现,也可以通过前后端配合实现。下面将详细介绍几种常用的实现方式。 使用 xlsx 库:使用 xlsx 库可以在前端将数据导出为Excel文件。首先需要安装 xlsx 库,然后在Vue组件中引入并使用该库来处理数据并导出Excel文件。以下是一

    2024年02月11日
    浏览(42)
  • unity多种方式实现文件选择和保存窗口

    编辑器的模式,可以利用EditorUtility类里面的方式实现,需要引用UnityEditor命名空间。 此种方式只支持在编辑器模式下运行,因为带有UnityEditor命名空间,故发布成exe之后不能使用。 首先需要引用 System.Windows.Forms 命名空间。 引用System.Windows.Forms报错 报错的是原因是缺少System

    2024年02月10日
    浏览(41)
  • C++进程间通信的多种方式及实现

    1、管道(Pipe):是一种半双工的通信方式,适用于具有亲缘关系的两个进程之间的通信。管道分为匿名管道和命名管道。 上述代码中,先调用pipe()函数创建了一个管道,并在fork()函数中创建了一个子进程。父进程向管道中写入一条消息,子进程从管道中读取该消息并输出到

    2024年02月15日
    浏览(31)
  • Python实现猜拳小游戏的多种方式

    猜拳小游戏是一个经典的小游戏项目,也是初学者学习编程的必要练手题目之一。在 Python 中,我们可以使用多种方式来实现一个简单的猜拳小游戏。 本文将依次介绍六种Python实现猜拳小游戏的方法,包括:使用 if-else 条件语句、使用 random 模块、使用字典映射胜负关系、f

    2024年02月08日
    浏览(43)
  • springboot实现ES多种分页方式

    es有两种分页方式 from+size 浅分页 scroll 深分页 在这里就不展开介绍了,网络上有很多相关介绍。 我们还可以通过维护 自增主键来实现分页 下面结合Springboot,通过代码展现实现es分页的三种实现方式 需要引入依赖: 代码: ESBase.java UserIdxES.java UserIdx.java UserIdxESReq.java 测试

    2024年02月10日
    浏览(42)
  • 前端实现下载文件的各种方式

    前端涉及到的文件下载还是很多应用场景的,那么前端文件下载有多少种方式呢?每种方式有什么优缺点呢?下面就来一一介绍。 通过 a 标签的 download 属性来实现文件下载,这种方式是最简单的,也是我们比较常用的方式,先来看示例代码: 就上面的这个示例,我们点击下

    2024年02月16日
    浏览(48)
  • C#面:列举ASP.NET页面之间传递值的几种方式

    查询字符串(Query String): 可以通过在URL中添加参数来传递值。 例如:http://example.com/page.aspx?id=123 在接收页面中可以通过Request.QueryString[“id”]来获取传递的值。 会话状态(Session State): 可以使用Session对象在不同页面之间存储和检索值。 在发送页面中可以使用Session[“k

    2024年02月19日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包