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

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

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

相关文章

十(1). 强制类型转换

继第十部分C强制类型转换的四种方式&#xff0c;再进行强化巩固一下知识点 static_cast 最常用的&#xff0c;在指针之间做转换 const_cast 去除常量属性 dynamic_cast 用在基类和派生类之间的转换 reinterpret_cast 在任意类型之间进行转 10.1 static_cast 常见的使用场景&am…

Git版本控制工具详解

如何区分开发环境和生产环境呢 答案就是写不同的配置文件&#xff0c;开发的设置成开发需要的&#xff0c;生产的设置成生产需要的&#xff0c;共同放到config这个配置文件夹下面&#xff0c;开发和生成的时候分别加载不同的配置文件 方式二就是使用相同的一个入口配置文件&a…

反向传播的核心是什么:计算损失函数对可训练参数的梯度=== 损失函数能通过计算图连接到可训练参数

反向传播的核心是什么:计算损失函数对可训练参数的梯度 损失函数能通过计算图连接到可训练参数 在深度学习中,反向传播的核心是计算损失函数对可训练参数的梯度,从而更新这些参数。对于LLM(大型语言模型)而言,是否需要“LLM输出的参数”才能进行反向传播 一、反向传播…

KINGCMS被入侵

现象会强制跳转到 一个异常网站,请掉截图代码. 代码中包含经过混淆处理的JavaScript&#xff0c;它使用了一种技术来隐藏其真实功能。代码中使用了eval函数来执行动态生成的代码&#xff0c;这是一种常见的技术&#xff0c;恶意脚本经常使用它来隐藏其真实目的。 这段脚本会检…

深入探索串的高级操作:从算法到 LeetCode 实战

串是编程中最常用的数据结构之一&#xff0c;从简单的文本处理到复杂的文本匹配算法&#xff0c;串的应用无处不在。在掌握了串的基本概念、存储结构以及KMP算法之后&#xff0c;现在让我们深入探索串的更多高级操作&#xff0c;例如求子串、串的替换等&#xff0c;并通过LeetC…

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …

OneNet + openssl + MTLL

1.OneNet 使用的教程 1.在网络上搜索onenet&#xff0c;注册并且登录账号。 2.产品服务-----物联网服务平台立即体验 3.在底下找到立即体验进去 4.产品开发------创建产品 5.关键是选择MQTT&#xff0c;其他的内容自己填写 6.这里产品以及开发完成&#xff0c;接下来就是添加设…

【Fiddler工具判断前后端Bug】

Fiddler工具判断前后端Bug的方法 使用Fiddler抓包工具可以高效定位问题是出在前端还是后端&#xff0c;主要通过分析请求和响应的内容、状态码、数据格式等关键信息。 分析请求是否成功发送 检查请求是否从客户端正确发出&#xff0c;观察Fiddler抓取的请求列表。若请求未出…

【论文阅读笔记】《A survey on deep learning approaches for text-to-SQL》

文章目录 一、论文基本信息1. 文章标题2. 所属刊物/会议3. 发表年份4. 作者列表5. 发表单位 二、摘要三、解决问题四、创新点五、自己的见解和感想六、研究背景七、研究方法&#xff08;模型、实验数据、评估指标&#xff09;八、总结&#xff08;做了什么、得到了什么、有什么…

【强连通分量 缩点 最长路 拓扑排序】P2656 采蘑菇|普及+

本文涉及知识点 C图论 强连通分量 缩点 最长路 拓扑排序 P2656 采蘑菇 题目描述 小胖和 ZYR 要去 ESQMS 森林采蘑菇。 ESQMS 森林间有 N N N 个小树丛&#xff0c; M M M 条小径&#xff0c;每条小径都是单向的&#xff0c;连接两个小树丛&#xff0c;上面都有一定数量的…

Dubbo Logback 远程调用携带traceid

背景 A项目有调用B项目的服务&#xff0c;A项目使用 logback 且有 MDC 方式做 traceid&#xff0c;调用B项目的时候&#xff0c;traceid 没传递过期&#xff0c;导致有时候不好排查问题和链路追踪 准备工作 因为使用的是 alibaba 的 dubbo 所以需要加入单独的包 <depend…

nodejs:用 nodemailer 发送一封带有附件的邮件

我们将使用 nodemailer 库来发送带有附件的邮件。 首先&#xff0c;确保已经安装了nodemailer。如果没有安装&#xff0c;可以通过 npm install nodemailer 来安装。 cnpm install nodemailer --save dependencies: – nodemailer ^7.0.3 步骤&#xff1a; 引入nodemailer模…

Scade 语言概念 - 方程(equation)

在 Scade 6 程序中自定义算子(Operator)的定义、或数据流定义(data_def)的内容中&#xff0c;包含一种基本的语言结构&#xff1a;方程(equation)(注1)。在本篇中&#xff0c;将叙述 Scade 语言方程的文法形式&#xff0c;以及作用。 注1: 对 Scade 中的 equation, 或 equation…

STM32开发,创建线程栈空间大小判断

1. 使用RTOS提供的API函数&#xff08;以FreeRTOS为例&#xff09; 函数原型&#xff1a;UBaseType_t uxTaskGetStackHighWaterMark(TaskHandle_t xTask)功能&#xff1a;获取指定任务堆栈中剩余的最小空间&#xff08;以字为单位&#xff0c;非字节&#xff09;。使用步骤&am…

thinkphp8.1 调用巨量广告API接口,刷新token

1、在mysql中建立表sys_token; CREATE TABLE sys_token (id int UNSIGNED NOT NULL,access_token varchar(50) COLLATE utf8mb4_general_ci NOT NULL,expires_in datetime NOT NULL,refresh_token varchar(50) COLLATE utf8mb4_general_ci NOT NULL,refresh_token_expires_in …

【leetcode】递归,回溯思想 + 巧妙解法-解决“N皇后”,以及“解数独”题目

&#x1f4da;️前言 &#x1f31f; 本期内容亮点&#xff1a;我们将深入解析力扣&#xff08;LeetCode&#xff09;上的几道经典算法题&#xff0c;涵盖不同难度和题型&#xff0c;帮助大家掌握解题思路和代码实现技巧。无论是准备面试还是提升算法能力&#xff0c;这些题解都…

【iOS安全】iPhone X iOS 16.7.11 (20H360) WinRa1n 越狱教程

前言 越狱iPhone之后&#xff0c;一定记得安装一下用于屏蔽更新的描述文件&#xff08;可使用爱思助手&#xff09; 因为即便关闭了自动更新&#xff0c;iPhone仍会在某些时候自动更新系统&#xff0c;导致越狱失效&#xff1b;更为严重的是&#xff0c;更新后的iOS版本可能是…

​​高频通信与航天电子的材料革命:猎板PCB高端压合基材技术解析​​

—聚酰亚胺/陶瓷基板在5G与航天场景的产业化应用​​ ​​一、极端环境材料体系&#xff1a;突破温域与频率极限​​ ​​聚酰亚胺基板&#xff08;PI&#xff09;的航天级稳定性​​ 猎板在卫星通信PCB中采用真空层压工艺处理聚酰亚胺基材&#xff08;Dk≈10.2&#xff09;&a…

pikachu靶场通关笔记13 XSS关卡09-XSS之href输出

目录 一、href 1、常见取值类型 2、使用示例 3、安全风险 二、源码分析 1、进入靶场 2、代码审计 3、渗透思路 三、渗透实战 1、注入payload1 2、注入payload2 3、注入payload3 本系列为通过《pikachu靶场通关笔记》的XSS关卡(共10关&#xff09;渗透集合&#xff…

day26-计算机网络-4

1. tcp的11种状态 ss -ant -a 表示看所有状态 -n 表示不将ip解析为主机名 -t 表示tcp 1.1. closed状态&#xff08;客户端、服务端&#xff09; 客户端发起建立连接前的状态服务端启动服务前的状态 1.2. listen状态&#xff08;服务端&#xff09; 服务端软件运行的时候状…