学习前端第二十九天(可迭代对象,映射和解构【弱】,Object.keys values)

一、可迭代对象

1、Symbol.iterator方法,使对象可迭代

[Symbol.iterator]() {
                let i = 5;
                return {
                    next() {
                        i--;
                        return { done: !i, value: i }
                    }
                }
            }

next()方法返回的结果的格式必须是{done:Boolean,value:any},当done=true时,表示循环结束,否则value是下一个值。

2、字符串是可迭代的

3、类数组对象 ,有索引和 length 属性的对象

let users = {  
            0: "css",
            1: "js",
            2: "html",
            length: 3,
        }

4、Array.from,将类数组对象转为数组

  let users = {  //必须在类数组对象中使用,形式与下面的相似,有索引和 length 属性
            0: "css",
            1: "js",
            2: "html",
            length: 3,
        }
        let newUsers = Array.from(users);   // 将类数组对象转为数组

        // 现在 ,newUsers是一个和users差不多的数组了
        console.log(newUsers); // ['css', 'js', 'html']

二、映射和集合(Map and Set)

1、Map  一个带键的数据项的集合,就像一个 Object 一样

  • new Map() —— 创建 一个新的map。
  • map.set(key, value) —— 根据键存储值。
  • map.get(key) —— 根据键来返回值,如果 map 中不存在对应的 key,则返回 undefined
  • map.has(key) —— 如果 key 存在则返回 true,否则返回 false
  • map.delete(key) —— 删除指定键的值。
  • map.clear() —— 清空 map。
  • map.size —— 返回当前元素个数。

2、Map 可以使用对象作为键;在对象中,无法使用对象作为键

let john = { name: "John" };

// 存储每个用户的来访次数
let visitsCountMap = new Map();

// john 是 Map 中的键
visitsCountMap.set(john, 123);

alert( visitsCountMap.get(john) ); // 123

3、链式调用

    const map = new Map();
        map
            .set("name", "jack")
            .set("age", 0)
            .set("gender", "male")
            .set("fugender", "male");

4、Map 迭代,按照值插入的顺序进行

  • map.keys() —— 遍历并返回一个包含所有键的可迭代对象
  • map.values() —— 遍历并返回一个包含所有值的可迭代对象
  • map.entries() —— 遍历并返回一个包含所有实体 [key, value] 的可迭代对象

5、对象,数组,Map相互转换

        // Object,Array,Map

        // Object -> Array: Object.entries({});

        // Array -> Object: Object.fromEntries([ [ ] ]);

        // Array -> Map: new Map([[]]);

        // Map -> Array: Array.from(new Map());

        // Object -> Map:new Map(Object.entries({}));

        // Map -> Object:Object.fromEntries(new Map());

6、Set,一个特殊的类型集合, “值的集合”(没有键),它的每一个值只能出现一次。

  • new Set(iterable) —— 创建一个 set,如果提供了一个 iterable 对象(通常是数组),将会从数组里面复制值到 set 中。
  • set.add(value) —— 添加一个值,返回 set 本身
  • set.delete(value) —— 删除值,如果 value 在这个方法调用的时候存在则返回 true ,否则返回 false
  • set.has(value) —— 如果 value 在 set 中,返回 true,否则返回 false
  • set.clear() —— 清空 set。
  • set.size —— 返回元素个数。

7、Set 可以迭代,按照值插入的顺序进行的

  • set.keys() —— 遍历并返回一个包含所有值的可迭代对象,
  • set.values() —— 与 set.keys() 作用相同,这是为了兼容 Map
  • set.entries() —— 遍历并返回一个包含所有的实体 [value, value] 的可迭代对象

8、数组去重

let arr = ["css", "css", "css", "git", "vue"]
let hobby = new Set(arr); // Set 自动合并相同元素
arr = Array.from(hobby); // 将Set 变为数组
console.log(arr); // ['css', 'git', 'vue']

9、弱映射和弱集合(用得少)

WeakMap 是类似于 Map 的集合,它仅允许对象作为键,并且一旦通过其他方式无法访问这些对象,垃圾回收便会将这些对象与其关联值一同删除。

WeakSet 是类似于 Set 的集合,它仅存储对象,并且一旦通过其他方式无法访问这些对象,垃圾回收便会将这些对象删除。

它们的主要优点是它们对对象是弱引用,所以被它们引用的对象很容易地被垃圾收集器移除。

这是以不支持 clearsizekeysvalues 等作为代价换来的……

WeakMap 和 WeakSet 被用作“主要”对象存储之外的“辅助”数据结构。一旦将对象从主存储器中删除,如果该对象仅被用作 WeakMap 或 WeakSet 的键,那么该对象将被自动清除。

三、Object.keys,values,entries

1、使用

  • Object.keys(obj) —— 返回一个包含该对象所有的键的数组。
  • Object.values(obj) —— 返回一个包含该对象所有的值的数组。
  • Object.entries(obj) —— 返回一个包含该对象所有 [key, value] 键值对的数组。
const user = {
            name: "jack",
            age: 20,
            gender: "male",
            [Symbol("allow")]: true,
        }

// 返回一个包含该对象所有的键/值/键值对的数组。忽略隐藏属性
console.log(Object.keys(user)); //(3) ['name', 'age', 'gender']
console.log(Object.values(user)); // ['jack', 20, 'male']
console.log(Object.entries(user)); //  [Array(2), Array(2), Array(2)]

2、返回Symbol属性

        const user = {
            name: "jack",
            age: 20,
            gender: "male",
            [Symbol("allow")]: true,
        }

        // 返回隐藏键
        console.log(Object.getOwnPropertySymbols(user));  //    [Symbol(allow)]
        // 返回所有键
        console.log(Reflect.ownKeys(user)); // ['name', 'age', 'gender', Symbol(allow)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/597626.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

量子力学(入门通俗版,转述)

/仅作参考和学习,勿作他用/ 量子力学 量子力学无非就是物理理论。 物理理论就是对自然现象的归纳。------不太容易理解的自然现象。 我们面对的世界,宏观和微观之分。宏观和微观的分界线就是原子。 微观世界和宏观世界没有什么共同点。 牛顿力学用于宏…

14、深入探讨JVM中令人头痛的‘Stop the World’难题

14.1、前文回顾 上一篇文章通过一个实际案例,深入剖析了新生代的对象分配机制,以及对象如何被迁移到老年代。我们还探讨了一个会频繁触发Full GC的场景,并提供了针对性的优化策略,相信大家对JVM的核心运行原理已经理解得相当透彻。 在本文中,我们将讨论一个让Java工程师…

鸿蒙内核源码分析(互斥锁篇) | 互斥锁比自旋锁丰满多了

内核中哪些地方会用到互斥锁?看图: 图中是内核有关模块对互斥锁初始化,有文件,有内存,用消息队列等等,使用面非常的广.其实在给内核源码加注的过程中,会看到大量的自旋锁和互斥锁,它们的存在有序的保证了内核和应用程序的正常运行.是非常基础和重要的功能. 概述 自旋锁 和…

Revit模型移动设备加载优化

BIM/CAD 模型可能包含大量细节,在智能手机和移动 VR 设备上加载时需要特别注意。以下是保持Revit模型整洁的一些步骤,以便任何人都可以毫无问题地加载它们。 NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 -…

亏了亏了!双向孟德尔随机化阴性结果居然发了SCI二区(IF=6.7)

‍ 今天为诸位介绍的这篇文章是一项双向孟德尔随机化研究(MR),惊讶的是,双向因果均为阴性结果发了SCI二区!我们一起来看看! 2024年4月17日,广东医科大学附属医院的学者做了一项双向两样本孟德尔…

绝地求生:PUBG杜卡迪联名进入倒计时3天!

大家好,我是闲游盒。 杜卡迪联名已经进入倒计时3天!喜欢的朋友要注意结束时间可千万别错过! 杜卡迪6色车辆 随着五一小长假的结束,本次混沌漫彩通行证也即将结束,本次通行证31级之后没升1级可额外领取1500BP和挑战者纪…

Spring与Mybatis-增删改查(注解方式与配置文件方式)

Spring框架下Mybaits的使用 准备数据库配置application.propertiespom.xml添加lombok依赖创建Emp实体类准备Mapper接口:EmpMapper预编译SQL根据id查询数据Mapper接口方法配置application.properties开启自动结果映射单元测试 条件模糊查询Mapper接口方法单元测试 根…

大模型时序预测初步调研20240506

AI预测相关目录 AI预测流程,包括ETL、算法策略、算法模型、模型评估、可视化等相关内容 最好有基础的python算法预测经验 EEMD策略及踩坑VMD-CNN-LSTM时序预测对双向LSTM等模型添加自注意力机制K折叠交叉验证optuna超参数优化框架多任务学习-模型融合策略Transform…

目标检测常用评价指标详解

🎀个人主页: https://zhangxiaoshu.blog.csdn.net 📢欢迎大家:关注🔍点赞👍评论📝收藏⭐️,如有错误敬请指正! 💕未来很长,值得我们全力奔赴更美好的生活&…

数字孪生—物联网技术

数字孪生涉及到诸多技术领域,物联网技术在数据孪生项目中具有重要的应用价值,主要体现在以下几个方面: 1.数据采集和实时监测:物联网技术可以用于实时采集各种设备、传感器和设施的数据,包括温度、湿度、压力、振动等…

CMakeLists.txt语法规则:foreach循环的关键字

一. 简介 前一篇文章学习了 CMakeLists.txt语法中 foreach循环的基本用法。文章如下: CMakeLists.txt语法规则:foreach 循环基本用法-CSDN博客 本文继续 CMakeLists.txt语法中 foreach循环语句,主要学习 foreach循环中的关键字。 二. CM…

【OceanBase诊断调优】—— SQL 执行报错而不能计入 SQL_AUDIT 的情况

通常,执行成果的 SQL 都会计入 SQL_AUDIT 中,而执行报错的 SQL 则需要依据其执行报错的阶段来决定是否计入 SQL_AUDIT 中。 在 OceanBase 数据库中,SQL 请求的执行流程如图所示。 如果 SQL 在进入 Executor 阶段前发生报错,则该 …

java-Spring-Lombok-讲解-(一文一言)创伤是成熟的途径

高手都在孤独前进-致敬我们不悔的青春 我打算每篇文章下找一下文言警句-说不那天会用上😁😁😁😁 每篇一言 创伤是成熟的途径 希望经历过创伤的人,能更好享受当下, 爱自己胜过爱别人呀 目录 🎻Lombok简介 &#…

KIE关键信息抽取——SDMG-R

https://arxiv.org/pdf/2103.14470https://arxiv.org/pdf/2103.14470 1.概述 背景:传统的关键信息提取方法依赖于模板匹配,这使它们难以泛化到未见过的模板,且对文本识别错误不够鲁棒。SDMG-R方法:提出一种端到端的双模态图推理方法,通过构建双模态图(视觉和文本特征),…

Celery(分布式任务队列)入门学习笔记

Celery 的简单介绍 用 Celery 官方的介绍:它是一个分布式任务队列; 简单,灵活,可靠的处理大量消息的分布式系统; 它专注于实时处理,并支持任务调度。 Celery 如果使用 RabbitMQ 作为消息系统的话,整个应用体系就是下…

GStreamer日志调试笔记

1、查询所有分类 #gst-launch-1.0 --gst-debug-help 2、查询videotestsrc的日志 #gst-launch-1.0 --gst-debug-help | findstr videotestsrc 结果: 3、使用--gst-debug设置相应日志类型的相应等级,越大显示日志越多,排查内存泄露可以设置为9 …

【iOS】多线程

文章目录 前言一、多线程的选择方案二、GCD和NSOperation的比较二、多线程相关概念任务队列 三、死锁情况主队列加同步任务 四、任务队列组合主队列异步并发队列异步 前言 这两天将iOS的多线程的使用都看了一遍,iOS的多线程方案有许多,本篇博客主要总结…

打开深度学习的锁:(0)什么是神经网络?

PS:每每温故必而知新 什么是神经网络? 一、一个单神经元的神经网络二、多个单神经元的神经网络三、到底什么是机器学习?(重点)1:什么是机器学习的训练?2:什么是模型?权重…

python数据分析所需要的语法基础

Python语言基础——语法基础 前言语法基础变量标识符数据类型输入与输出代码缩进与注释 总结 前言 对于学过C语言的人来说,python其实很简单。学过一种语言,学习另一种语言,很显然的能感觉到,语言大体上都是相通的。当然&#xf…

【docker】常用的把springboot打包为docker镜像的maven插件

Spring Boot Maven Plugin: Spring Boot 自带的 Maven 插件 (spring-boot-maven-plugin) 支持直接生成 Docker 镜像。通过配置,可以在 Maven 构建过程中自动构建 Docker 镜像,而无需单独编写 Dockerfile。这种方法简化了将应用打包为 Docker 镜像的过程。…
最新文章