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

news2025/7/25 9:13:49

在 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);

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

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

相关文章

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; 这是一个非…

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

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

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

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

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

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

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;消费的也是同一个队列。加快了队列中的消息的消费速度。 可以看到两个消费者已经在消费了

JAVA-springboot JUnit单元测试

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

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 …

[论文阅读] 人工智能+项目管理 | 当 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的用…

5.RV1126-OPENCV 图形计算面积

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

【Android基础回顾】一:Binder机制是什么?有什么用?

Android中的Binder机制是Android系统中最核心和最基础的进程间通讯机制。 1 什么是进程间通讯机制(IPC)&#xff1f; 众所周知&#xff0c;Android系统基于Linux开发&#xff0c;Linux系统里面本来就有进程间通讯机制。 1.1 Linux的IPC(Inter-Process Communication)概览 它…

LeetCode 高频 SQL 50 题(基础版) 之 【高级查询和连接】· 上

题目&#xff1a;1731. 每位经理的下属员工数量 题解&#xff1a; select employee_id,name,reports_count,average_age from Employees t1,(select reports_to,count(*) reports_count,round(avg(age)) average_agefrom Employeeswhere reports_to is not nullgroup by repor…

资产智慧管理安全监测中心

在数字经济高速发展的今天&#xff0c;资产管理的智能化已成为企业降本增效的核心竞争力。从智慧园区到古建筑群&#xff0c;从交通枢纽到城市电网&#xff0c;资产智慧管理安全监测中心正以物联网、人工智能、数字孪生等技术为支撑&#xff0c;构建起资产全生命周期的“智慧大…

从零开始的云计算——番外实战,iptables防火墙项目

目录 一网络规划 二项目要求 三环境准备 1防火墙设置 2PC1设置 3PC2设置 4服务器S1设置 四环境检测 1内网链接 2外网连接 五防火墙配置及测试 1内部网络中的pc1采用SNAT访问外部互联网&#xff0c;但是无法ping到内部网关。 ​编辑​编辑 2内部网络服务器s1通过DN…

【基于阿里云搭建数据仓库(离线)】IDEA导出Jar包(包括第三方依赖)

目录 方法一&#xff1a; 方法二 1.双击"package”即可进行打包呈jar 2.双击后就会自动打包生成jar了&#xff0c; 生成的jar在这个目录下 3.右击&#xff0c;点击“复制路径/引用”&#xff0c;即可获得“绝对路径”、“根路径”等相关信息 前提&#xff1a; 在pop.…

【物联网-TCP/IP】

物联网-TCP/IP ■ TCP/IP■■■ 添加链接描述 ■ TCP/IP ■ ■ ■

Halcon光度立体法

1、光度立体法&#xff0c;可用于将对象的三维形状与其二维纹理&#xff08;例如打印图像&#xff09;分离。需要用不同方向而且已知照明方向的多个光源&#xff0c;拍摄同一物体的至少三张图像。请注意&#xff0c;所有图像的相机视角必须相同。 物体的三维形状主要被计算为三…