当前位置: 首页 > news >正文

从0开始学习JavaScript--JavaScript数据类型与数据结构

JavaScript作为一门动态、弱类型的脚本语言,拥有丰富的数据类型和数据结构,这些构建了语言的基础,为开发者提供了灵活性和表达力。本文将深入探讨JavaScript中的各种数据类型,包括基本数据类型和复杂数据类型,并介绍常用的数据结构,以丰富的示例代码帮助读者更好地理解和应用这些概念。

基本数据类型

JavaScript有七种基本数据类型,分别是:

  • Number(数字)
  • String(字符串)
  • Boolean(布尔)
  • Null(空)
  • Undefined(未定义)
  • Symbol(符号,ES6新增)
  • BigInt(大整数,ES2020新增)
// 示例:基本数据类型
let num = 42; // Number
let str = 'Hello, World!'; // String
let isTrue = true; // Boolean
let empty = null; // Null
let notDefined = undefined; // Undefined
let sym = Symbol('unique'); // Symbol
let bigInt = 9007199254740991n; // BigInt

引用数据类型

引用数据类型包括:

  • Object(对象)
  • Array(数组)
  • Function(函数)
  • Date(日期)
  • RegExp(正则表达式)
  • Map(映射)
  • Set(集合)
// 示例:引用数据类型
let obj = { key: 'value' }; // Object
let arr = [1, 2, 3]; // Array
let func = function() { /* 函数体 */ }; // Function
let today = new Date(); // Date
let regex = /pattern/; // RegExplet map = new Map();
map.set('name', 'John'); // Maplet set = new Set();
set.add(1).add(2).add(3); // Set

类型转换

JavaScript是一门弱类型语言,它会自动进行类型转换。了解类型转换有助于我们更好地理解代码的执行过程。

// 示例:类型转换
let numAsString = '42';
let convertedNum = Number(numAsString);
console.log(convertedNum); // 输出:42let boolAsString = 'true';
let convertedBool = Boolean(boolAsString);
console.log(convertedBool); // 输出:true

数据结构

1 数组(Array)

数组是一种有序的集合,可以包含任意类型的数据。

// 示例:数组
let fruits = ['apple', 'orange', 'banana'];
console.log(fruits[0]); // 输出:apple
console.log(fruits.length); // 输出:3

2 对象(Object)

对象是一种无序的集合,由键值对组成。

// 示例:对象
let person = {name: 'John',age: 30,city: 'New York'
};
console.log(person.name); // 输出:John

3 Map和Set

Map是一种键值对的集合,而Set是一种值的集合,它们提供了更灵活的数据组织方式。

// 示例:Map和Set
let userMap = new Map();
userMap.set('name', 'Alice').set('age', 25);let uniqueNumbers = new Set([1, 2, 3, 4, 5, 5, 5]);

JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端数据传输。

// 示例:JSON
let jsonData = '{"name": "Bob", "age": 28}';
let parsedData = JSON.parse(jsonData);
console.log(parsedData.name); // 输出:Boblet dataToBeSent = { status: 'success', code: 200 };
let jsonString = JSON.stringify(dataToBeSent);

迭代与遍历

JavaScript提供了多种迭代和遍历数据结构的方式,如for...of循环、forEach方法等。

// 示例:迭代与遍历
let numbers = [1, 2, 3, 4, 5];
for (let num of numbers) {console.log(num);
}numbers.forEach(num => {console.log(num);
});

数据类型与数据结构的选择

在实际开发中,选择合适的数据类型和数据结构至关重要。例如,使用数组来存储有序的数据集合,使用对象或Map来存储键值对。

// 示例:数据类型与数据结构的选择
let student1 = { name: 'Alice', age: 20, grade: 'A' };
let student2 = { name: 'Bob', age: 22, grade: 'B' };
let studentsArray = [student1, student2];let studentsMap = new Map();
studentsMap.set('Alice', { age: 20, grade: 'A' });
studentsMap.set('Bob', { age: 22, grade: 'B' });

常见问题与解决方案

在处理JavaScript数据类型和数据结构时,常常会遇到一些常见的问题,例如如何遍历嵌套对象、如何判断数据类型等。以下是一些常见问题的解决方案。

1 遍历嵌套对象

遍历嵌套对象需要使用递归或其他迭代方法。

// 示例:遍历嵌套对象
function recursiveIteration(obj) {for (let key in obj) {if (typeof obj[key] === 'object' && obj[key] !== null) {recursiveIteration(obj[key]);} else {console.log(obj[key]);}}
}let nestedObject = {key1: 'value1',key2: {key3: 'value3',key4: {key5: 'value5'}}
};recursiveIteration(nestedObject);

2 判断数据类型

判断数据类型可以使用typeof运算符,但对于对象和数组,更准确的方式是使用Array.isArrayObject.prototype.toString方法。

// 示例:判断数据类型
let data = [1, 2, 3];console.log(typeof data); // 输出:object
console.log(Array.isArray(data)); // 输出:true
console.log(Object.prototype.toString.call(data)); // 输出:[object Array]

实战示例

结合实际场景,可以使用数据类型和数据结构来解决具体问题。比如,在一个学生信息管理系统中,可以使用对象存储学生信息,数组存储所有学生,通过遍历和查询实现各种功能。

// 示例:学生信息管理系统
let students = [{ name: 'Alice', age: 20, grade: 'A' },{ name: 'Bob', age: 22, grade: 'B' },// 更多学生...
];function addStudent(student) {students.push(student);
}function findStudentByName(name) {return students.find(student => student.name === name);
}// 其他功能函数...// 添加新学生
addStudent({ name: 'Charlie', age: 21, grade: 'A' });// 查找学生信息
let foundStudent = findStudentByName('Bob');
console.log(foundStudent); // 输出:{ name: 'Bob', age: 22, grade: 'B' }

总结

深入理解JavaScript的数据类型与数据结构对于编写高效、清晰的代码至关重要。通过对基本数据类型、引用数据类型、常见数据结构以及类型转换的深入学习,能够更好地应用这些知识解决实际问题。

随着JavaScript语言的发展,可以期待更多新的数据类型和数据结构的出现,以及更多方便的数据操作方法,进一步提高开发效率。希望本文能够为大家提供对JavaScript数据类型与数据结构的深入了解,为日后的编程实践提供有力的支持。

相关文章:

从0开始学习JavaScript--JavaScript数据类型与数据结构

JavaScript作为一门动态、弱类型的脚本语言,拥有丰富的数据类型和数据结构,这些构建了语言的基础,为开发者提供了灵活性和表达力。本文将深入探讨JavaScript中的各种数据类型,包括基本数据类型和复杂数据类型,并介绍常…...

数据结构与算法编程题20

统计二叉树的叶结点个数。 #define _CRT_SECURE_NO_WARNINGS#include <iostream> using namespace std;typedef char ElemType; #define ERROR 0 #define OK 1 typedef struct BiNode {ElemType data;BiNode* lchild, * rchild; }BiNode,*BiTree;bool Create_tree(BiTre…...

FreeRTOS源码阅读笔记5--mutex

互斥量是一种特殊的二值信号量&#xff0c;拥有优先级继承的机制&#xff0c;所以适合用在临界资源互斥访问。 5.1创建互斥量xSemaphoreCreateMutex() 5.1.1函数原型 5.1.2函数框架 5.2创建递归互斥量xSemaphoreCreateRecursiveMutex() 5.2.1函数原型 5.2.2函数框架 xSemaph…...

STM32_7(ADC)

一、ADC ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁12位逐次逼近型ADC&#xff0c;1us转换时间输入电压范围&#xff1a;0~3.3V&#xff0c;…...

Flink实战(11)-Exactly-Once语义之两阶段提交

0 大纲 [Apache Flink]2017年12月发布的1.4.0版本开始&#xff0c;为流计算引入里程碑特性&#xff1a;TwoPhaseCommitSinkFunction。它提取了两阶段提交协议的通用逻辑&#xff0c;使得通过Flink来构建端到端的Exactly-Once程序成为可能。同时支持&#xff1a; 数据源&#…...

日志技术logback

一&#xff0c;日志概括 二&#xff0c;日志技术的特点 三&#xff0c;日志技术的体系 三&#xff0c;入门 四&#xff0c;案例 package XinZheng;import org.slf4j.Logger; import org.slf4j.LoggerFactory;public class Main58 {//1,创建一个Logger日志对象public static fi…...

linux(1)之build构建系统基础(一)

Linux(1)之buildroot构建系统(一) Author&#xff1a;Onceday Date&#xff1a;2023年11月12日 漫漫长路&#xff0c;才刚刚开始… 参考文档&#xff1a; The Yocto ProjectBuildroot - Making Embedded Linux Easy 文章目录 Linux(1)之buildroot构建系统(一)1. 概述1.1 如…...

25 Linux I2C 驱动

一、I2C简介 I2C老朋友了&#xff0c;在单片机里面也学过&#xff0c;现在再复习一下。I2C使用两条线在主控制器和从机之间进行数据通信。一条是 SCL(串行时钟线)&#xff0c;另外一条是 SDA(串行数据线)&#xff0c;这两条数据线需要接上拉电阻&#xff0c;总线空闲的时候 SCL…...

API 设计:使用 Node.js 和 Express.js 的综合教程

API&#xff08;应用程序编程接口&#xff09;设计涉及创建一个高效而强大的接口&#xff0c;允许不同的软件应用程序相互交互。 说明 本教程将指导您使用 Node.js 和 Express.js 作为核心技术来规划、设计和构建 API。但是&#xff0c;这些原则可以应用于任何语言或框架。我们…...

vite和webpack的区别和练习

Vite和Webpack都是现代化的前端构建工具&#xff0c;但它们之间存在一些区别&#xff1a; 构建性能&#xff1a;Vite使用ES Modules提高了构建性能&#xff0c;可以在构建时只构建需要的部分&#xff0c;而Webpack则需要在构建时处理整个应用程序。 开发体验&#xff1a;Vite具…...

Python与设计模式--装饰器模式

6-Python与设计模式–装饰器模式 一、快餐点餐系统 又提到了那个快餐点餐系统&#xff0c;不过今天我们只以其中的一个类作为主角&#xff1a;饮料类。 首先&#xff0c;回忆下饮料类&#xff1a; class Beverage():name ""price 0.0type "BEVERAGE"…...

flutter之graphic图表自定义tooltip

renderer graphic中tooltip的TooltipGuide类提供了renderer方法&#xff0c;接收三个参数Size类型&#xff0c;Offset类型&#xff0c;Map<int, Tuple>类型。可查到的文档是真的少&#xff0c;所以只能在源码中扒拉例子&#xff0c;做符合需求的修改。 官方github示例 …...

逆向扒cocosjs安卓包教程-破解加密的js源码

本文只适用于cocosjs引擎打包的游戏apk,针对此类apk进行源码级别的逆向破解,可直接逐个破解工程内的源码部分,让游戏逻辑大白于你的面前,你可以针对js源码进行二次开发。按照我的教程破解过程中遇到什么问题,欢迎留言。 目录 准备apk包 查找加密key 解密jsc文件 方案1…...

Kafka(一)

一&#xff1a;简介 解决高吞吐量项目的需求 是一款为大数据而生的消息中间件&#xff0c;具有百亿级tps的吞吐量&#xff0c;在数据采集、传输、存储的过程中发挥着作用 二&#xff1a;为什么要使用消息队列 一个普通访问量的接口和一个大并发的接口&#xff0c;它们背后的…...

【Amazon】安装卸载AWS CLI操作流程(Windows 、Linux系统)

AWS 命令行界面&#xff08;AWS CLI&#xff09;是用于管理 AWS 产品的统一工具。只需要下载和配置一个工具&#xff0c;您就可以使用命令行控制多个 AWS 产品并利用脚本来自动执行这些服务。 AWS CLI v2 提供了多项新功能&#xff0c;包括改进的安装程序、新的配置选项&#…...

Django同时连接多种数据库

我的使用场景需要同时连接达梦数据库和MYSQL数据库&#xff0c;有的功能需要查询达梦&#xff0c;有的功能则需要查询MYSQL。 第一步&#xff1a;在 Django 的 settings.py 文件中&#xff0c;配置多个数据库连接。你可以在 DATABASES 字典中添加多个数据库配置。每个数据库配置…...

【链表之练习题】

文章目录 翻转链表找到链表的中间节点返回倒数第k个节点合并两个有序链表判断链表是否回文注意 翻转链表 //反转链表//实质上是把每一个节点头插法,原本第一个节点变成最后一个节点public ListNode reverseList(){//链表为空if (head null){return null;}//链表只有一个节点if…...

情感对话机器人的任务体系

人类在处理对话中的情感时&#xff0c;需要先根据对话场景中的蛛丝马迹判断出对方的情感&#xff0c;继而根据对话的主题等信息思考自身用什么情感进行回复&#xff0c;最后结合推理出的情感形成恰当的回复。受人类处理情感对话的启发&#xff0c;情感对话机器人需要完成以下几…...

【笔记 Pytorch 08】深度学习模板 (未完)

文章目录 一、声明二、工程结构三、文件内容main.pymodel.pydataset.pyutils.py 四、问题汇总 一、声明 非常感谢这些资料的作者&#xff1a; 【参考1】、【PyTorch速成教程 (by Sung Kim)】 二、工程结构 ├── main.py&#xff1a;实现训练 (train) 、验证(validation)和…...

【如何学习Python自动化测试】—— Cookie 处理

前提 网络通信是当今社会最为普及和繁荣的技术之一&#xff0c;其承载了人们生活中瞬息万变的信息传递和交流。而作为网络通信的核心要素&#xff0c;网络协议、socket、cookie和session则是网络通信的灵魂。 一、网络协议 网络协议是计算机和网络设备之间相互通信的规则和标准…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...