(day 23)JavaScript学习笔记(内置对象2之JSON、Set、Map)

news2024/12/1 10:33:14

概述 

        这是我的学习笔记,记录了JavaScript的学习过程。在写博客的时候我会尽量详尽的记录每个知识点。如果你完全没接触过JavaScript,那么这一系列的学习笔记可能会对你有所帮助。

        今天继续学习JavaScript内置的对象,主要是Json、Set、Map。

1.内置对象JSON

        JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于ECMAScript的一个子集,采用完全独立于语言的文本格式来存储和表示数据。JSON是理想的数据交换语言,易于人阅读和编写,同时也易于机器解析和生成。

        JavaScript中的JSON对象提供了两个主要的方法: JSON.parse()和JSON.stringify(),分别用于将JavaScript对象或值转换为JSON字符串,以及将JSON字符串解析为JavaScript对象或值。

        JSON支持的数据类型有对象、数组、数字,字符串、布尔、null。它的key必须用双引号括起来,如下代码是写了一个符合JSON格式的字符串,它的类型是String类型。

var postJSON = `{
    "id":1001,
    "title":"标题",
    "comments":[
        {
            "userId":2001,
            "comment":"这是2001的评论"
        },
        {
            "userId":2002,
            "comment":"这是2002的评论"
        },
    ],
    "publishned":true,
    "author":null
}`;
console.log(postJSON);
console.log(typeof postJSON); //输出:string

         JSON.parse()方法用于将一个JSON字符串解析为JavaScript对象或值。如下代码:

ojbJSON = JSON.parse(postJSON);
console.log(ojbJSON); //{id: 1001, title: '标题', comments: Array(2), publishned: true, author: null}
console.log(typeof ojbJSON); //object

        JSON字符串最外层也可以是数组的形式 ,如下代码所示:

var comments = `[
    {
        "userId":2001,
        "comment":"这是2001的评论"
    },
    {
        "userId":2002,
        "comment":"这是2002的评论"
    }
]`;

console.log(JSON.parse(comments));//(2) [{…}, {…}]

         JSON.stringify()方法用于将JavaScript值(对象或数组)转换为一个JSON字符串。如下代码所示,我们先定义一个对象,再把它转换为JSON字符串:

var role = {
  id: 1001,
  name: "唐三",
  skills: ["鬼影迷踪", "紫极魔瞳", "玄玉手", "蓝银霸王枪", "无定风波"],
};

console.log(role); //{id: 1001, name: '唐三', skills: Array(5)}
console.log(typeof role); //object

roleStr = JSON.stringify(role); //将对象转换为字符串
console.log(roleStr); //{"id":1001,"name":"唐三","skills":["鬼影迷踪","紫极魔瞳","玄玉手","蓝银霸王枪","无定风波"]}
console.log(typeof roleStr); //string

         上面代码中console.log(roleStr)运行结果如下图所示:

        这种格式不好阅读,我们在转换的时候可以传递参数,如下代码所示:

console.log(JSON.stringify(role, null, 2));

        运行结果如下所示,这样阅读就清晰多了。

 

         JSON.stringify(参数1,参数2,参数3)方法中的三个参数说明如下:

  • 参数1:将要序列化成JSON字符串的值。
  • 参数2:(可选)如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的JSON字符串中。
  • 参数3:(可选)用于指定缩进空格数;如果省略该参数,则将返回没有空格的字符串。如果这个参数是数字,它表示有多少空格;如果这个参数是字符串,那么该字符串就被当做空格用。

        如下代码演示:

console.log(JSON.stringify(role, ["id", "name"], 2));

        运行输出:

 

2.内置对象set

        在JavaScript中Set表示值的集合,类似于数组,但是成员的值都是唯一的,没有重复的值。Set对象是一种特殊的类型,它允许我们存储任何类型的唯一值,无论是原始值或者是对象引用。        

        Set对象有一些非常有用的方法和属性,比如:

add(value):向集合中添加一个新的值。
delete(value):从集合中删除一个值。
has(value):判断一个值是否在集合中。
clear():清空集合中的所有元素。
size:返回集合中元素的数量。
        下面是一些使用Set对象的示例:

// 创建一个新的Set对象  
let mySet = new Set();  
  
// 使用add方法添加元素  
mySet.add(1);  
mySet.add(2);  
mySet.add(2); // 这行代码不会添加任何元素,因为值2已经存在于集合中  
  
// 使用has方法检查元素是否存在  
console.log(mySet.has(1)); // 输出: true  
console.log(mySet.has(3)); // 输出: false  
  
// 使用size属性获取集合中元素的数量  
console.log(mySet.size); // 输出: 2  
  
// 使用delete方法删除元素  
mySet.delete(2);  
console.log(mySet.has(2)); // 输出: false  
  
// 使用clear方法清空集合  
mySet.clear();  
console.log(mySet.size); // 输出: 0

        Set对象的一个常见用途是去除数组中的重复项。例如:

let arr = [1, 2, 2, 3, 4, 4, 5];  
  
let uniqueArr = [...new Set(arr)];  //扩展运算符 ... 用于将 Set 对象转换回数组
  
console.log(uniqueArr); // 输出: [1, 2, 3, 4, 5]

        在这个例子中,我们创建了一个新的Set对象,并将数组arr作为参数传递给它。由于Set对象只存储唯一的值,所以当我们将Set对象转换回数组时,重复的元素就被去除了。

        需要注意的是,Set对象中的元素顺序与它们被添加的顺序是一致的(在ES6规范中),但是不同JavaScript引擎的实现可能会有所不同。

        另外,虽然Set可以存储对象作为成员,但由于JavaScript对象是通过引用来比较相等性的,所以如果两个对象即使看起来相同(具有相同的属性和值),在Set中也会被认为是不同的。如果要比较对象的内容是否相等,可能需要自己实现比较逻辑。

3.内置对象Map

        在JavaScript中,Map是一个内置对象,它提供了一种存储键值对的数据结构。与普通的对象(Object)不同,Map允许你使用任何类型的键(对象或原始值),并且它按照插入的顺序迭代元素。

        Map对象提供了一些有用的方法,包括:

set(key, value): 设置Map对象中键的值。返回该Map对象。
get(key): 返回键对应的值,或者返回undefined(如果键不存在)。
has(key): 返回一个布尔值,表示Map对象中是否存在该键。
delete(key): 从Map对象中删除指定的元素,返回true如果删除成功,否则返回false。
clear(): 移除Map对象的所有键/值对。
size: 返回Map对象中的键/值对的数量。
        下面是一些使用Map的示例:

// 创建一个新的Map对象  
let myMap = new Map();  
  
// 使用set方法添加元素  
myMap.set('key1', 'value1');  
myMap.set('key2', 'value2');  
myMap.set(1, 'value3'); // Map允许使用非字符串作为键  
  
// 使用get方法获取元素  
console.log(myMap.get('key1')); // 输出: 'value1'  
console.log(myMap.get(1)); // 输出: 'value3'  
  
// 使用has方法检查键是否存在  
console.log(myMap.has('key2')); // 输出: true  
console.log(myMap.has('key3')); // 输出: false  
  
// 使用size属性获取元素数量  
console.log(myMap.size); // 输出: 3  
  
// 使用delete方法删除元素  
myMap.delete('key1');  
console.log(myMap.has('key1')); // 输出: false  
  
// 使用clear方法清空Map  
myMap.clear();  
console.log(myMap.size); // 输出: 0

        Map对象特别有用在需要保持键值对插入顺序的场合,或者当键是复杂对象时。普通的JavaScript对象将键转换为字符串,并且不保证顺序。而Map对象则不会进行这样的转换,并且会记住元素的插入顺序。

        此外,Map对象还提供了迭代功能,可以使用for...of循环来遍历它的元素:

let myMap2 = new Map();
myMap2.set("a", 1);
myMap2.set("b", 2);
myMap2.set("c", 3);

for (let [key, value] of myMap2) {
  console.log(key, value);
}
// 输出:
// a 1
// b 2
// c 3

        在这个例子中,for...of循环直接解构了Map对象的每个元素,每个元素都是一个包含键和值的数组。

        map也可以用foreach遍历,如下代码演示:

myMap2.forEach((value, key) => {
  console.log(key, value);
});
// 输出:
// a 1
// b 2
// c 3

        总之,Map对象提供了一种强大且灵活的方式来存储和操作键值对,特别是在需要保持键值对插入顺序或者键是复杂对象时,它比普通对象更为适用。 

       以上便是今天的学习内容,如果对你有所帮助,请点个赞再走吧。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

02正式学习第一天

1、windows上加载socket库 链接输入ws2_32.lib 代码code&#xff1a; #ifdef _WIN32 #include<windows.h> #else #include <sys/socket.h> #include<sys/types.h> #include<unistd.h> #include<cstring> #include<arpa/inet.h> #include…

在jupyter notebook中使用conda环境

在jupyter notebook中使用conda环境 1. 环境配置 conda activate my-conda-env # this is the environment for your project and code conda install ipykernel conda deactivateconda activate base # could be also some other environment conda install nb_cond…

Java集成E签宝实现签署

完整代码&#xff1a;java-boot-highpin-background: 背调服务 (gitee.com) 【暂不开源】 1.在application.yml中配置appid、密钥信息&#xff0c;包含沙箱环境javaesign:host: https://smlopenapi.esign.cnappId: your appIdappSecret: your secret 2.实现电子签的主要流程在…

主干网络篇 | YOLOv8更换主干网络之EfficientNet

前言:Hello大家好,我是小哥谈。EfficientNet是一种高效的卷积神经网络架构,由Mingxing Tan和Quoc V. Le在2019年提出,其设计思想是在不增加计算复杂度的情况下提高模型的准确性。它引入了一个称为"复合系数"的概念,该系数用于同时缩放网络的深度、宽度和分辨率。…

C++类继承基础2——虚函数和纯虚函数

虚函数 如前所述&#xff0c;在C语言中&#xff0c;当我们使用基类的引用或指针调用一个虚成员函数时会执行动态绑定。 因为我们直到运行时才能知道到底调用了哪个版本的虚函数&#xff0c;所以所有虚函数都必须有定义。 通常情况下&#xff0c;如果我们不使用某个函数&…

C++:继承的介绍和深度解析

一、继承的概念和定义 1.什么是继承&#xff1f; 继承&#xff0c;顾名思义&#xff1a;就和现实生活中&#xff0c;孩子继承父母的东西有点类似。比如&#xff0c;你父亲的财产&#xff0c;你可以继承下来&#xff0c;你就可以使用父亲的钱。 官方一点的介绍&#xff1a; 继承…

代码随想录阅读笔记-二叉树【对称二叉树】

题目 给定一个二叉树&#xff0c;检查它是否是镜像对称的。 思路 首先想清楚&#xff0c;判断对称二叉树要比较的是哪两个节点&#xff0c;要比较的可不是左右节点&#xff01; 对于二叉树是否对称&#xff0c;要比较的是根节点的左子树与右子树是不是相互翻转的&#xff0…

2024 ccfcsp认证打卡 2021 12 01 序列查询

2021 12-1 序列查询 题解1题解2区别第一种算法&#xff1a;第二种算法&#xff1a; 题解1 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);// 输入n表示商品数目&#xff0c;N表示总数int n sc.n…

使用Vite安装TailwindCSS

一、认识TailwindCSS Tailwind CSS 是一个基于原子类的 CSS 框架&#xff0c;它提供了一种不同于传统 CSS 框架的方式来构建用户界面。下面是关于 Tailwind CSS 的优缺点以及它适合应用的情况&#xff1a; 优点&#xff1a; 灵活性&#xff1a; Tailwind CSS 提供了大量的原…

Portal Particle

Unity3D Portal Particle 2.2传送门粒子效果 链接&#xff1a;https://pan.baidu.com/s/1TCMXIif5d288lXHgixnDPw?pwd1234 下载&#xff1a;资源下载链接 效果图&#xff1a;

Java虚拟机(JVM)知识点总结

一. Java内存区域 1. JVM的内存区域划分&#xff0c;以及各部分的作用 可分为运行时数据区域和本地内存&#xff0c;按照线程私有和线程共享分类&#xff1a; 线程私有&#xff1a;程序计数器、虚拟机栈、本地方法栈。 线程共享&#xff1a;堆、方法区、直接内存。 JDK1.7…

V R虚拟现实元宇宙的前景|虚拟现实体验店加 盟合作|V R设备在线购买

VR&#xff08;虚拟现实&#xff09;技术作为一种新兴的技术&#xff0c;正在逐渐改变人们的生活和工作方式。随着技术的不断进步&#xff0c;人们对于元宇宙的概念也越来越感兴趣。元宇宙是一个虚拟世界&#xff0c;通过VR技术可以实现人们在其中进行各种活动和交互。 元宇宙的…

(C++17) std算法之执行策略 execution

文章目录 前言Code测试Code运行效果 msvc源码描述源码std::sequenced_policy seqstd::parallel_policy parstd::parallel_unsequenced_policy par_unseqstd::unsequenced_policy unseq END 前言 ref:算法库-执行策略 - cppreference.com 利用多核cpu加速算法在目前看来已经不是…

Springboot+MybatisPlus+EasyExcel实现文件导入数据

记录一下写Excel文件导入数据所经历的问题。 springboot提供的文件处理MultipartFile有关方法&#xff0c;我没有具体看文档&#xff0c;但目测比较复杂&#xff0c; 遂了解学习了一下别的文件上传方法&#xff0c;本文第1节记录的是springboot原始的导入文件方法写法&#xf…

论文阅读-《Lite Pose: Efficient Architecture Design for 2D Human Pose Estimation》

摘要 这篇论文主要研究了2D人体姿态估计的高效架构设计。姿态估计在以人为中心的视觉应用中发挥着关键作用&#xff0c;但由于基于HRNet的先进姿态估计模型计算成本高昂&#xff08;每帧超过150 GMACs&#xff09;&#xff0c;难以在资源受限的边缘设备上部署。因此&#xff0…

vue的创建、启动以及目录结构详解

vue的创建、启动以及目录结构详解目录 一. vue项目的创建 二. vue的目录结构 三. src的目录结构 四. vue项目的启动 4.1 方法1 4.2 方法2 一. vue项目的创建 创建一个工程化的Vue项目&#xff0c;执行命令&#xff1a;npm init vuelatest 注意&#xff1a;如果你在这个目…

【Python基础教程】3 . 算法的时间复杂度

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;python基础教程 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、…

[每周一更]-第91期:认识AMD的CPU

这一章来认识下AMD,说起AMD&#xff0c;从我上大学那时候&#xff0c;就选购的AMD 速龙系列&#xff0c;生活拮据的情况下&#xff0c;拉着室友去郑州电子城&#xff0c;在跟奸商老板的拉扯下&#xff0c;斥资2000购入一个无显卡 的台式机&#xff08;实在是资金有限&#xff0…

【Spring源码】WebSocket做推送动作的底层实例

一、前瞻 Ok&#xff0c;开始我们今天的对Spring的【模块阅读】。 那就挑Web里的WebSocket模块&#xff0c;先思考下本次阅读的阅读线索&#xff1a; WebSocket在Spring里起到什么作用这个模块采用了什么设计模式我们都知道WebSocket可以主动推送消息给用户&#xff0c;那做推…

小程序中使用less

在vscode中安装插件 找到左下角齿轮的设置&#xff0c;点击右边图标&#xff0c;进入“settings.json” 加上以下代码配置 "less.compile":{"outExt": ".wxss"}