五、TypeScript 数组
现在我们来学习
TypeScript 数组,学完这一节,我们要知道,如何使用数组;如何创建数组;如何获取数组中的元素;如何遍历数组。
1. 数组概述
首先,什么是数组呢?我们为什么要使用数组呢?带着这两个疑问,我们来思考以下问题:
问题1:存储一个人的名字,怎么存?
你可能会觉得这个问题很简单,人的名字应该是字符串,那么声明一个字符串类型的变量来存储即可。
let name1: string = '迪丽热巴'
问题2:存储三个人的名字,怎么存?
我们可以声明三个字符串类型的变量 。
let name1: string = '迪丽热巴'
let name2: string = '古力娜扎'
let name3: string = '马尔扎哈'
问题3:如果是存储一个班级中所有人的名字呢?
呃。。。存储多个数据时,声明多个变量就太繁琐了。
有没有更简单的方式呢,答案肯定是有的,就是我们今天要学习的数组。
什么是数组呢?数组是用于存放多个数据的集合。 也就是说,有了数组之后,只需要使用一个数组([]),就可以存储任意多个数据。
比如以上存储多个人名的问题,就可以使用数组:
let names: string[] = ['迪丽热巴', '古力娜扎', '马尔扎哈']
没有数组时存储三个人的名字,就需要三个字符串类型的变量。
let name1: string = '迪丽热巴'
let name2: string = '古力娜扎'
let name3: string = '马尔扎哈'
很明显,利用数组,可以更方便地存储多个人名。这样的话,即便你有再多的人名要存储,也只需要一个数组就可以了。
还有一点需要注意:**数组中,通常是相同类型的数据。**比如以上用来存储多个姓名的数组,每一项内容都是一个字符串,所以这是一个字符串数组。
2. 创建数组
在TS中,创建数组有两种语法形式。 我们先来看第一种。
let names: string[] = []
这种方式非常简单,我们是比较推荐的。[](中括号)表示数组。如果数组中没有内容,就是一个空数组。不管它有没有内容,都表示一个数组。以上代码创建好一个空数组,将这个空数组赋值给变量names。
数组的类型注解由两部分组成:类型+[]。此处表示字符串类型的数组(只能出现字符串类型)。
我们可以往数组存放字符串类型的项。
let names: string[] = ['迪丽热巴']
那我们可以往数组存放多个字符串类型的项吗?那肯定是可以的。
let names: string[] = ['迪丽热巴', '古力娜扎', '马尔扎哈']
数组中的每一项内容称为:元素。以上数组存放多个元素,注意多个元素之间使用逗号(,)分隔。
咱们接着看第二种创建数组的语法。
let names: string[] = new Array()
以上代码创建好一个空数组,将这个空数组赋值给变量names。功能与语法一 [] 相同,但是更加繁琐,所以我们不推荐:
let names: string[] = []
当数组中有数据时:
let names: string[] = new Array('迪丽热巴', '古力娜扎', '马尔扎哈')
相当于语法一:
let names: string[] = ['迪丽热巴', '古力娜扎', '马尔扎哈']
对比以上两种创建数组的语法,我们更加推荐语法一。数组中多个元素之间使用逗号(,)分隔。 我们指定了数组的注解为什么样的数据类型,数组中的每个元素就只能是什么数据类型。
3. 数组长度和索引
3.1 概述
我们先来通过一个例子来认识“数组长度和索引”。生活中,我们经常会排队,比如我们去吃饭,但是吃饭的人特别多,这时候我们就需要排队了。 在排队的时候,队伍是有长度的,队伍有多少人,长度就是多少。我们都知道,排队是不能插队的,我们讲究先来后到,队伍是有顺序的,每个人都有序号,你排在第几个,你的序号就是几。
我们知道了,队伍的特征:1 长度 2 顺序和序号(队伍中的每个人)。
我们可以把数组想象成这个队伍,因为数组也有长度,也有顺序并且数组中的每个元素也有序号。
3.2 数组长度
数组长度表示数组中元素的个数,通过数组的 length 属性来获取。 “length ”这个单词就表示“长度”的意思。
现在我们有一个数组:
let foods: string[] = ['煎饼', '馒头', '米饭']
我们想要获取数组长度,就可以通过数组的 length 属性来获取:
console.log(foods.length) // 3
接下来我们来看数组的索引,前面我们讲了:数组中的每个元素都有自己的序号。 它就跟我们排队一样,每个人都有自己的序号。
在TS中,我们把数组中元素的序号,称为:索引(下标),数组中的元素与索引一一对应。也就是说,数组中的每一个元素都有一个索引号。就好比我们在排队的时候,不管你排在第几个,你只会有一个序号,不可能同时有两个序号。但是我们要注意:数组索引是从 0 开始的。
let foods: string[] = ['煎饼', '馒头', '米饭']
以上数组的索引分别为:
‘煎饼’ => 0
‘馒头’ => 1
‘米饭’ => 2
接下来我们思考一个问题:这个数组的长度是多少呀?没错是3。这个数组的最大索引是几呀?是的,是2。
那么该数组的长度(length)和最大索引之间有什么关系?
很显然,最大索引为:length - 1
最后我们做一个总结:
数组是有序的集合,用来存储多个数据。
通过数组名.length
获取数组长度
数组索引是从0开始的
4. 取值和存值
4.1 取值
什么是取值呢?从数组中,获取到某一个元素的值,就是从数组中取值。比如以下数组,我们想要获取到最爱的食物 — 煎饼
let foods: string[] = ['煎饼', '馒头', '米饭']
以上数组的索引分别为:
‘煎饼’ => 0
‘馒头’ => 1
‘米饭’ => 2
我们知道,数组中的元素与索引是一一对应的,那么我们就可以通过索引获取到某一个元素的值。
那么对应到TS,我们应该怎么实现呢?接下来我们就来看一下语法。
语法:
数组名称[索引]
我们想要获取到最爱的食物 — 煎饼。煎饼的索引值是0,所以:
console.log(foods[0]) // 煎饼
4.2 存值
那么什么是数组存值呢?如果要修改数组中某个元素的值,就要使用数组存值。(比如,不爱吃馒头,将馒头替换为包子)
还是同一个数组:
let foods: string[] = ['煎饼', '馒头', '米饭']
以上数组的索引分别为:
‘煎饼’ => 0
‘馒头’ => 1
‘米饭’ => 2
我们怎么实现将馒头替换为包子呢?我们要先获取到要修改的元素,然后,再存值。 接下来我们就来看一下语法。
语法:
数组名称[索引] = 新值
这里我们要获取的“馒头”元素索引为1,新值是 “包子”。所以:
foods[1] = '包子'
console.log(foods) // ['煎饼', '包子', '米饭']
4.3 添加元素
接下来我们来学习如何往数组中添加元素。
实际上,我们前面学习的存值的语法:数组名称[索引] = 新值,这个语法不仅能实现修改元素 ,还可以实现添加元素。
那什么时候是修改,什么时候是添加呢?是根据我们获取的数组元素的索引是否存在决定的。当索引存在时,就实现修改功能;当索引不存在时,就实现添加功能。
还是前面我们使用的数组:
let foods: string[] = ['煎饼', '馒头', '米饭']
以上数组的索引分别为:
‘煎饼’ => 0
‘馒头’ => 1
‘米饭’ => 2
当我们执行foods[1] = '包子'
,这时候索引存在,就表示:修改元素。
当我们执行foods[3] = '油泼面'
,这时候索引不存在,就表示:添加元素。
console.log(foods) // ['煎饼', '馒头', '米饭', '油泼面']
5. 遍历数组
遍历数组,也就是把数组中的所有元素挨个获取一次。那我们拿到每个元素有什么用呢?下面我们就通过一个例子来说明。
let nums: number[] = [100, 200, 300]
现在我们想计算出这个数组所有数字的和。也就是分别拿到100、200、300,然后把它们加在一起。在这样的场景下,我们就需要获取到数组中的每一个元素。
我们可以通过数组取值的方式,一个个取出来:
console.log(nums[0]) // 100
console.log(nums[1]) // 200
console.log(nums[2]) // 300
如果数组中有100个、1000个、10000个元素呢?那太繁琐,相似的代码重复多次。前面我们讲过,重复做某件事情,可以使用 for 循环遍历数组。重复取值的规律:索引号自增(每次加1 ),而 for 循环的计数器i也是自增的:
let sum: number = 0;
for (let i: number = 0; i < nums.length; i++) {
sum += nums[i]);
}
console.log(sum);
注意1:因为数组索引是从0开始的,所以计数器i的默认值为0。
注意2:应该根据数组长度来计算,公式为数组长度减一,也就是:nums.length – 1(最大索引)。
优势:不管数组中元素的数量怎么变化,for循环的判断条件不需要改动。
最后,我们做个总结:
遍历数组,也就是把数组中的所有元素挨个获取一次。
使用for循环语句遍历数组
for循环计数器的默认值是0
for循环的判断条件是i < nums.length
来自 https://blog.csdn.net/weixin_46261309/article/details/107670832