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

JavaScript 数组与流程控制:从基础操作到实战应用

在 JavaScript 编程的世界里,数组是一种极为重要的数据结构,它就像是一个有序的 “收纳盒”,能够将多个值整齐地存储起来。而流程控制语句则像是 “指挥官”,能够按照特定的逻辑对数组进行遍历和操作。接下来,就让我们深入了解 JavaScript 数组与流程控制的相关知识。

一、数组的概念与创建​

1.1 数组的定义与特点​

数组是用于存储多个值的有序集合,它具有以下特点:​

  • 有序:每个值都有一个索引,索引从 0 开始,就像书架上的书编号一样,通过编号能快速找到对应的书。​
  • 异构:可以存储不同类型的值,无论是数字、字符串,还是复杂的对象,都能被数组容纳。​
  • 数组是引用类型,属于对象的一种,这意味着在传递和操作数组时,实际上操作的是对数组对象的引用。​

1.2 创建数组的方式​

  • 使用字面量:这是最常用的创建数组的方式,简洁直观。
let arr = [1, 2, 3];
  • 使用构造函数:可以通过构造函数创建数组,有两种常见形式。
// 常规写法,创建包含指定元素的数组
let arr = new Array(1, 2, 3);
console.log(arr);
// 创建长度为5的空数组
let emptyArr = new Array(5);
console.log(emptyArr.length);

运行结果:

1.3 数组类型判断​

在编程过程中,有时需要判断一个对象是否为数组,常用的判断方式有:​

  • 对象 instanceof Array:通过instanceof运算符判断对象是否是Array的实例。​
let arr = [1, 2, 3];
console.log(arr instanceof Array); // true
  • Array.isArray (对象):这是 JavaScript 提供的专门用于判断数组的方法,更加准确和便捷。​
let arr = [1, 2, 3];
console.log(Array.isArray(arr)); // true

二、数组元素的基础操作

2.1 数组的基本操作方法

方法描述
push(value)在数组末尾添加新元素
pop()删除并返回数组最后一个元素
unshift(value)在数组开头添加新元素
shift()删除并返回数组第一个元素
slice(start, end)返回数组的一个副本(不修改原数组)
splice(index, deleteCount, items...)删除或插入元素(修改原数组)

2.2 增加元素

末尾添加:push ():push()方法可以在数组末尾添加一个或多个元素,并返回数组新的长度。

let arr = [1, 2, 3];
let newLength = arr.push(4, 5);
console.log(arr); // [1, 2, 3, 4, 5]
console.log(newLength); // 5

开头添加:unshift ():unshift()方法用于在数组开头添加一个或多个元素,并返回数组新的长度。

let arr = [1, 2, 3];
let newLength = arr.unshift(0);
console.log(arr); // [0, 1, 2, 3]
console.log(newLength); // 4

指定位置添加:splice (index, count=0, 新增元素):splice()方法从指定索引位置开始,删除count个元素(count为 0 时不删除元素),并插入新增元素。

let arr = [1, 3, 4];
arr.splice(1, 0, 2);
console.log(arr); // [1, 2, 3, 4]

2.3 删除元素 

末尾删除:pop ():pop()方法用于删除数组的最后一个元素,并返回被删除的元素。

let arr = [1, 2, 3];
let removedElement = arr.pop();
console.log(arr); // [1, 2]
console.log(removedElement); // 3

开头删除:shift ():shift()方法用于删除数组的第一个元素,并返回被删除的元素。

let arr = [1, 2, 3];
let removedElement = arr.shift();
console.log(arr); // [2, 3]
console.log(removedElement); // 1

指定位置删除:splice (index, count>0):从指定索引位置开始,删除count个元素。

let arr = [1, 2, 3, 4, 5];
arr.splice(1, 2);
console.log(arr); // [1, 4, 5]

2.4 修改元素

直接通过索引赋值修改:通过数组的索引直接对元素进行重新赋值。

let arr = [1, 2, 3];
arr[1] = 10;
console.log(arr); // [1, 10, 3]

通过splice (index, count, 修改元素)修改:通过数组的索引直接对元素进行重新赋值。

let arr = [1, 2, 3];
arr.splice(1, 1, 10, 20);
console.log(arr); // [1, 10, 20, 3]

2.5 查找元素

根据索引查找:直接通过索引访问数组元素。

let arr = [1, 2, 3];
console.log(arr[1]); // 2

查找是否存在:includes ():includes()方法用于判断数组中是否包含指定元素,返回true或false。

let arr = [1, 2, 3];
console.log(arr.includes(2)); // true

查找索引:indexOf () /lastIndexOf ():indexOf()返回指定元素在数组中第一次出现的索引,lastIndexOf()返回指定元素在数组中最后一次出现的索引,若元素不存在则返回 -1。

let arr = [1, 2, 3, 2];
console.log(arr.indexOf(2)); // 1
console.log(arr.lastIndexOf(2)); // 3

2.5 数组切片

数组切片是指从现有数组中提取一部分元素,创建一个新数组。切片不会改变原来的数组,会创建一个新的数组,JavaScript 提供了slice()方法来实现这一功能。

语法:

arr.slice(startIndex, endIndex);
  • startIndex:开始索引(包含),若为负数则从数组末尾开始计算。
  • endIndex:结束索引(不包含),可选参数,默认为数组长度。

实例代码:

let arr = [10, 20, 30, 40, 50];// 从索引1到索引3(不包含)
let sliced = arr.slice(1, 3);
console.log(sliced); // [20, 30]// 从索引2到末尾
let slicedToEnd = arr.slice(2);
console.log(slicedToEnd); // [30, 40, 50]// 使用负数索引
let slicedFromEnd = arr.slice(-3, -1);
console.log(slicedFromEnd); // [30, 40]

注意事项:

  1. slice()方法不会修改原数组,而是返回一个新数组。
  2. 若省略endIndex,则切片会包含从startIndex到数组末尾的所有元素。
  3. 当索引超出数组范围时,slice()会自动处理边界,不会抛出错误。

三、遍历数组

3.1 for 循环遍历

for循环是最基础的遍历方式,通过控制循环条件和索引来访问数组的每个元素。

let arr = [1, 2, 3, 4, 5];
for (let i = 0; i < arr.length; i++) {console.log(arr[i]);
}

3.2 while 循环遍历

while循环同样可以实现数组的遍历,需要手动控制索引的递增。

let arr = [1, 2, 3, 4, 5];
let i = 0;
while (i < arr.length) {console.log(arr[i]);i++;
}

3.3 for - of 循环遍历

for - of循环是 ES6 引入的新特性,它更加简洁直观,直接遍历数组的元素值。

let arr = [1, 2, 3, 4, 5];
for (let element of arr) {console.log(element);
}

四、数组的进阶用法

4.1 map 方法​

map()方法可以对数组中的每个元素进行映射转换,生成一个新数组,原数组不会被修改。它接收一个回调函数作为参数,回调函数的返回值会组成新数组。

let numbers = [1, 2, 3, 4];
let doubled = numbers.map(num => num * 2);
console.log(doubled); // [2, 4, 6, 8]
console.log(numbers); // [1, 2, 3, 4]

4.2 filter 方法​

filter()方法用于筛选出符合条件的元素,返回一个包含所有满足条件元素的新数组。

let numbers = [1, 2, 3, 4];
let evenNumbers = numbers.filter(num => num % 2 === 0)
console.log(evenNumbers);
console.log(numbers);

4.3 reduce 方法​

reduce()方法能对数组元素进行累加、汇总等操作。它接收一个回调函数和一个初始值,回调函数接收四个参数(累加器、当前值、当前索引、原数组),通过不断执行回调函数,将数组 “化简” 为一个值。

let numbers = [1, 2, 3, 4];
let sum = numbers.reduce((acc, crr) => acc + crr, 0);
console.log(sum); // 10

4.4 forEach 方法​

forEach()方法用于遍历数组,对数组中的每个元素执行一次提供的函数,但它没有返回值,主要用于执行一些副作用操作,如打印数组元素。

let numbers = [1, 2, 3, 4];
let fruits = ['apple', 'banana', 'cherry'];
fruits.forEach(fruit => console.log(fruit));

4.5 some 方法​

some()方法用于检测数组中是否至少有一个元素满足指定条件,只要有一个元素满足条件,就返回true,否则返回false。

let numbers = [1, 2, 3, 4];
let hasEven = numbers.some(num => num % 2 === 0);
console.log(hasEven); // true

4.6 every 方法​

every()方法用于检测数组中的所有元素是否都满足指定条件,只有所有元素都满足条件,才返回true,否则返回false。

let numbers = [1, 2, 3, 4];
let allPositive = numbers.every(num => num % 2 === 0);
console.log(allPositive); // true

五、综合案例:学生成绩统计

let scores = [85, 90, 78, 92, 88];
let sum = 0;
let max = scores[0];
let min = scores[0];
for (let score of scores) {sum += score;if (score > max) {max = score;}if (score < min) {min = score;}
}
let average = sum / scores.length;
console.log("平均成绩:", average);
console.log("最高分:", max);
console.log("最低分:", min);

相关文章:

JavaScript 数组与流程控制:从基础操作到实战应用

在 JavaScript 编程的世界里&#xff0c;数组是一种极为重要的数据结构&#xff0c;它就像是一个有序的 “收纳盒”&#xff0c;能够将多个值整齐地存储起来。而流程控制语句则像是 “指挥官”&#xff0c;能够按照特定的逻辑对数组进行遍历和操作。接下来&#xff0c;就让我们…...

STM32中自动生成Flash地址的方法

每页大小为 2KB(0x800 字节),地址间隔为 0x800 总地址空间覆盖范围:0x08000000 ~ 0x0803F800(共 256KB) 适用于 STM32 大容量 / 中容量产品(如 F103 系列) 代码如下 // 通用定义(需根据实际页大小调整) #define FLASH_BASE_ADDR 0x08000000 #define FLASH_PAGE_SIZ…...

Matlab | MATLAB 中的插值详解

MATLAB 中的插值详解 插值是数值分析中的核心技术,用于在已知数据点之间估计未知点的值。MATLAB 提供了完整的插值函数库,涵盖一维到高维数据,支持多种插值方法。以下从基础到高级全面解析: 一、插值核心概念 1. 数学本质 给定数据点 ( x i , y i ) (x_i, y_i) (<...

SkyWalking架构深度解析:分布式系统监控的利器

一、SkyWalking概述 SkyWalking是一款开源的APM(应用性能监控)系统&#xff0c;专门为微服务、云原生和容器化架构设计。它由Apache软件基金会孵化并毕业&#xff0c;已成为分布式系统监控领域的明星项目。 核心特性 ‌分布式追踪‌&#xff1a;跨服务调用链路的完整追踪‌服务…...

vue2中的render函数

<script> export default {components: {},name: "renderElems",render (h, context) {return this.$attrs.vnode;},updated() {} } </script> <style scoped> </style>分析一下上面.vue组件&#xff1a; 组件结构&#xff1a; 这是一个非…...

逆向工程开篇(连载中)

项目特点 这个专栏专门设计用于汇编逆向工程研究&#xff0c;包含&#xff1a; ✅ 18个测试模块&#xff0c;覆盖所有主要C语言特性✅ 1200行工具类代码&#xff0c;400行主程序代码✅ 完整的Visual Studio 2017项目支持✅ Debug和Release两种构建配置✅ 静态库和可执行文件分…...

this.$set() 的用法详解(Vue响应式系统相关)

1. 什么是 this.$set()&#xff1f; this.$set(target, key, value) 是 Vue 2 中提供的一个方法&#xff0c;用于向响应式对象中动态添加属性&#xff0c;确保新加的属性同样是响应式的。 2. 为什么需要它&#xff1f; Vue 2 的响应式系统基于 Object.defineProperty&#…...

PARADISE:用于新生儿缺氧缺血性脑病(HIE)疾病识别与分割的个性化和区域适应性方法|文献速递-深度学习医疗AI最新文献

Title 题目 PARADISE: Personalized and regional adaptation for HIE disease identification and segmentation PARADISE&#xff1a;用于新生儿缺氧缺血性脑病&#xff08;HIE&#xff09;疾病识别与分割的个性化和区域适应性方法 1 文献速递介绍 缺氧缺血性脑病&…...

RabbitMQ 监控与调优实战指南(二)

五、调优策略与实战&#xff1a;对症下药提升性能 5.1 配置参数调优 在 RabbitMQ 的性能优化中&#xff0c;合理调整配置参数是关键的一环&#xff0c;这些参数涉及内存、磁盘、网络等多个资源层面&#xff0c;对 RabbitMQ 的整体性能有着深远的影响。 内存相关配置&#xf…...

WordPress子主题RiPro-V5van无授权全开源版(源码下载)

WordPress子主题RiPro-V5van无授权全开源版&#xff0c;直接上使用方法:WordPress后台上传就行 这个主题是1.0版本开源的&#xff0c;有能力的可以二次开发一下加一些自己喜欢的功能。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/90952148 更多资…...

保姆级Elasticsearch集群部署指导

一、环境准备 1. 硬件要求&#xff08;单节点建议&#xff09; CPU&#xff1a;至少2核&#xff08;生产环境4核&#xff09;内存&#xff1a;至少4GB&#xff08;生产环境建议16GB&#xff0c;且为偶数&#xff0c;如8GB、16GB&#xff09;磁盘&#xff1a;至少50GB SSD&…...

PyQt实现3维数组与界面TableWidget双向绑定

以下是一个使用PyQt实现3维数组与界面TableWidget双向绑定的示例代码。该程序包含一个下拉菜单选择第0维索引&#xff0c;表格展示第1维和第2维的数据&#xff0c;并支持双向数据同步&#xff1a; import sys import numpy as np from PyQt5.QtWidgets import (QApplication, …...

StoreView SQL,让数据分析不受地域限制

作者&#xff1a;章建&#xff08;处知&#xff09; 引言 日志服务 SLS 是云原生观测和分析平台&#xff0c;为 Log、Metric、Trace 等数据提供大规模、低成本、实时的平台化服务。SLS 提供了多地域支持【1】&#xff0c;方便用户可以根据数据源就近接入 SLS 服务&#xff0c…...

护网面试题目2025

护网基础试题 一、描述外网打点的流程&#xff1f; 靶标确认、信息收集、漏洞探测、漏洞利用、权限获取。最终的目的是获取靶标的系统权限/关键数据。在这个过程中&#xff0c;信息收集最为重要。掌握靶标情报越多&#xff0c;后续就会有更多的攻击方式去打点。比如&#xff…...

Figma 与 Cursor 深度集成的完整解决方案

以下是 Figma 与 Cursor 深度集成的完整解决方案&#xff0c;实现设计-开发无缝协作&#xff1a; 一、集成架构设计 #mermaid-svg-NdvcKTZAZfX9DiUO {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-NdvcKTZAZfX9DiUO…...

UCRT 和 MSVC 的区别(Windows 平台上 C/C++ 开发相关)

UCRT 和 MSVC 是与 Windows 平台上 C/C 开发相关的两个重要概念&#xff0c;它们都属于 Microsoft 的开发工具链的一部分。下面详细解释它们的含义、区别以及用途。 一、UCRT&#xff08;Universal C Runtime&#xff09; 1. 含义&#xff1a; UCRT&#xff08;Universal C …...

rabbitmq Fanout交换机简介

给每个服务创建一个队列&#xff0c;然后每个业务订阅一个队列&#xff0c;进行消费。 如订单服务起个多个服务&#xff0c;代码是一样的&#xff0c;消费的也是同一个队列。加快了队列中的消息的消费速度。 可以看到两个消费者已经在消费了...

【机器学习】集成学习与梯度提升决策树

目录 一、引言 二、自举聚合与随机森林 三、集成学习器 四、提升算法 五、Python代码实现集成学习与梯度提升决策树的实验 六、总结 一、引言 在机器学习的广阔领域中,集成学习(Ensemble Learning)犹如一座闪耀的明星,它通过组合多个基本学习器的力量,创造出…...

Palo Alto Networks Expedition存在命令注入漏洞(CVE-2025-0107)

免责声明 本文档所述漏洞详情及复现方法仅限用于合法授权的安全研究和学术教育用途。任何个人或组织不得利用本文内容从事未经许可的渗透测试、网络攻击或其他违法行为。使用者应确保其行为符合相关法律法规,并取得目标系统的明确授权。 对于因不当使用本文信息而造成的任何直…...

WebFuture:Ubuntu 系统上在线安装.NET Core 8 的步骤

方法一&#xff1a;使用官方二进制包安装 下载.NET Core 8 SDK 二进制包&#xff1a;访问 .NET Core 8 SDK 官方下载页面&#xff0c;根据你的系统架构选择对应的 Linux x64 版本等下载链接&#xff0c;将其下载到本地4. 创建安装目录&#xff1a;在终端中执行以下命令创建用于…...

JAVA-springboot JUnit单元测试

SpringBoot从入门到精通-第9章 JUnit单元测试 一、JUnit与单元测试 JUnit是一个开源的测试框架&#xff0c;虽然可以用于测试大多数编程语言的应用程序&#xff0c;但特别适合用于测试Java语言的应用程序。 软件测试一般分为4个阶段&#xff0c;即单元测试、集成测试、系统测…...

hot100 -- 6.矩阵系列

1.矩阵置零 问题&#xff1a;给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 方法&#xff1a;记录行列 置0 # 记录行列&#xff0c;分别置0 def set_zero(matrix):row, col [], []# 统计0元素…...

PyCharm中运行.py脚本程序

1.最近在弄一个python脚本程序&#xff0c;记录下运行过程。 2.编写的python程序如下 # # Copyright 2017 Pixar # # Licensed under the terms set forth in the LICENSE.txt file available at # https://openusd.org/license. # # Check whether this script is being run …...

吴恩达MCP课程(5):research_server_prompt_resource.py

代码 import arxiv import json import os from typing import List from mcp.server.fastmcp import FastMCPPAPER_DIR "papers"# Initialize FastMCP server mcp FastMCP("research")mcp.tool() def search_papers(topic: str, max_results: int 5) …...

[论文阅读] 人工智能+项目管理 | 当 PMBOK 遇见 AI:传统项目管理框架的破局之路

当PMBOK遇见AI&#xff1a;传统项目管理框架的“AI适配指南” 论文信息 arXiv:2506.02214 Is PMBOK Guide the Right Fit for AI? Re-evaluating Project Management in the Face of Artificial Intelligence Projects Alexey Burdakov, Max Jaihyun Ahn Subjects: Software …...

Gateway 搭建

1.创建 moudle 命名为 gateway 2,pom中引入依赖 网关依赖&#xff1b;注册中心依赖等 <!-- 网关依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></d…...

pytorch基本运算-导数和f-string

引言 在前序对机器学习的探究过程中&#xff0c;我们已经深刻体会到人工智能到处都有微分求导运算&#xff0c;相关文章链接包括且不限于&#xff1a; BP神经网络 逻辑回归 对于pytorch张量&#xff0c;求导运算必不可少&#xff0c;所以本次就专门来学习一下。 f-string的用…...

impala中更改公网ip为内网ip

实际有时候需求中需要将公网的impala监听ip改为内网的ip 步骤 1&#xff0c;更改配置文件中的ip 1&#xff0c;更改/etc/default/impala中的ip配置重启服务即可在hive元数据同一个节点上要启动sudo service impala-state-store restartsudo service impala-catalog restart所有…...

5.RV1126-OPENCV 图形计算面积

一.图形面积、弧长计算介绍 前面我们已经把图形轮廓的检测、画框等功能讲解了一遍。这次主要结合轮廓检测的 API 去计算图形的面积&#xff0c;这些面积可以是矩形、圆形等等。图形面积计算和弧长计算常用于车辆识别、桥梁识别等重要功能&#xff0c;常用的 API 如 contourArea…...

一键净化Excel数据:高性能Python脚本实现多核并行清理

摘要 本文分享两个基于Python的Excel数据净化脚本&#xff0c;通过多进程并行技术清除工作表内不可见字符、批注、单元格样式等冗余内容&#xff0c;利用OpenPyXL实现底层操作&#xff0c;结合tqdm进度条和进程级任务分配&#xff0c;可快速处理百万级单元格数据。适用于数据分…...