目录
(一)初识数组
思考:如何保存一个班级的所有学生的相关信息,如姓名、学号、年龄?
回答:一种方法利用前面学习过的知识,则每一条信息都需要一个变量去保存,缺点是这样做很麻烦,而且容易出错,又不合理;另一种方法就是利用数组。
概念:数组是存储一系列值的变量集合。
数组构成:数组由一个或多个数组元素组成的,各元素之间使用逗号“,”分割。
数组元素:每个数组元素由“下标”和“值”构成。
下标:又称索引,以数字表示,默认从0开始依次递增,用于识别元素。
值:元素的内容,可以是任意类型的数据,如数值型、字符型、数组、对象等。
数组还可以根据维数划分为一维数组、二维数组、三维数组等多维数组。
一维数组:就是指数组的“值”是非数组类型的数据,如上图。
二维数组:是指数组元素的“值”是一个一维数组,如下图。
多维数组:当一个数组的值又是一个数组时,就可以形成多维数组。它通常用于描述一些信息。
解决开始提出的问题:保存一个班级学生信息,每个数组元素都代表一个学生,而每个学生都使用一个一维数组分别表示其姓名、学号、年龄等信息,这样通过一个变量即可有规律的保存一个班级的所有学生信息,方便开发时进行处理。
(二)创建数组
数组在JavaScript中的创建方式:
实例化Array对象的方式。
直接使用“[]”的方式。
1.使用Array对象创建数组
实例化Array对象的方式创建数组,是通过new关键字实现的。
// 元素值类型为字符串
var area = new Array('Beijing', 'Shanghai', 'Shenzhen');
// 元素值类型为数值型
var score = new Array(56, 68, 98, 44);
// 元素值类型为混合型
var mix = new Array(123, 'abc', null, true, undefined);
// 空数组
var arr1 = new Array(); 或 var arr2 = new Array;
2.使用“[]”创建数组
直接法“[]”与Array()对象的使用方式类似,只需将new Array()替换为[]即可。
var weather = ['wind', 'fine',]; // 相当于:new Array('wind', 'fine',)
var empty = []; // 相当于:new Array
// 控制台输出mood:(5) ["sad", empty × 3, "happy"]
var mood = ['sad', , , ,'happy'];
在创建数组时,最后一个元素后的逗号可以存在,也可以省略。
(三)数组的基本操作
1.获取数组长度
Array对象提供的length属性可以获取数组的长度,其值为数组元素最大下标加1。
var arr1 = [78, 88, 98];
var arr2 = ['a', , , , 'b', 'c'];
console.log(arr1.length); // 输出结果为:3
console.log(arr2.length); // 输出结果为:6
这里不是逗号作为数据哦,而是空格
数组的length属性不仅可以用于获取数组长度,还可以修改数组长度。
在利用length属性指定数组长度时,有以下是三种情况:
1.若length的值大于数组中原来的元素个数,则没有值的数组元素会占用空存储位置
var arr1 = [];
arr1.length = 5;
console.log(arr1); // 输出结果:(5) [empty × 5]
var arr2 = [1, 2, 3];
arr2.length = 4;
console.log(arr2); // 输出结果:(4) [1, 2, 3, empty]
2. 若length的值等于数组中原来的元素个数,数组长度不变。
var arr3 = ['a', 'b'];
arr3.length = 2;
console.log(arr3); // 输出结果:(2) ["a", "b"]
若length的值小于数组中原来的元素个数,多余的数组元素将会被舍弃
var arr4 = ['hehe', 'xixi', 'gugu', 'jiujiu'];
arr4.length = 3;
console.log(arr4); // 输出结果:(3) ["hehe", "xixi", "gugu"]
除此之外,在利用Array对象方式创建数组时,也可以指定数组的长度。
var arr = new Array(3);
console.log(arr); // 输出结果:(3) [empty × 3]
JavaScript中不论何种方式指定数组长度后,并不影响继续为数组添加元素,同时数组的length属性值会发生相应的改变。(3);
2.数组的访问与遍历——访问数组元素
数组元素访问方式:“数组名[下标]”。
接下来,通过一个例子来演示如何访问数组元素,具体参考教材例3-1 。
3.数组的访问与遍历——遍历数组元素
概念:所谓遍历数组就是依次访问数组中所有元素的操作。
利用下标遍历数组可以使用:for(已学)。
利用下标遍历数组可以使用:for…in语句。
4.数组的访问与遍历——遍历数组
除此之外,若object是一个对象,for…in还可以用于对象的遍历
在ES6中,新增了一种for…of语法,可以更方便地对数组进行遍历。
变量value:表示每次遍历时对应的数组元素的值。
变量arr:表示待遍历的数组。
5.元素的添加与修改
元素的添加与修改元素的方式:“数组名[下标]”。
提示:与访问数组中的元素的方式相同。
6.元素的添加与修改——添加元素
7.元素的添加与修改——修改元素
修改元素与添加元素的使用相同,区别在于修改元素是为已含有值的元素重新赋值
8.元素的删除
在创建数组后,有时也需要根据实际情况,删除数组中的某个元素值。
例如,一个保存全班学生信息的多维数组,若这个班级中有一个学生转学了,那么在这个保存学生信息的数组中就需要删除此学生。
此时,可以利用delete关键字删除该数组元素的值。
delete关键字只能删除数组中指定下标的元素值,删除后该元素依然会占用一个空的存储位置。
多学一招:解构赋值
除了前面学习过的变量声明与赋值方式,ES6中还提供了另外一种方式——解构赋值。例如,若把数组[1,2,3]中的元素分别赋值为a、b和c,传统的做法是单独为变量声明和赋值。
当左侧变量的数量小于右侧的元素的个数,则忽略多余的元素。
当左侧变量数量大于右侧的元素个数时,则多余的变量会被初始化为undefined
解构赋值时右侧的内容还可以是一个变量。
(四)常见数组方法
1.栈和队列方法
JavaScript中,除了前面讲解的添加与删除数组元素的方式外,还可以利用Array对象提供的方法,模拟栈和队列的操作。
在数组的末尾或开头添加数组的新元素。
在数组的末尾或开头删除数组元素。
方法名称 | 功能描述 |
push() | 将一个或多个元素添加到数组的末尾,并返回数组的新长度。 |
unshift() | 将一个或多个元素添加到数组的开头,并返回数组的新长度。 |
pop() | 从数组的末尾移出并返回一个元素,若是空数组则返回undefined。 |
shift() | 从数组的开头移出并返回一个元素,若是空数组则返回undefined。 |
2.检索方法
在开发中,若要检测给定的值是否是数组,或是查找指定的元素在数组中的位置。
方法名称 | 功能描述 |
includes() | 用于确定数组中是否含有某个元素,含有返回true,否则返回false。 |
Array.isArray() | 用于确定传递的值是否是一个 Array,是返回true,不是返回false。 |
indexOf() | 返回在数组中可以找到给定值的第一个索引,如果不存在,则返回-1 |
lastIndexOf() | 返回指定元素在数组中的最后一个的索引,如果不存在则返回 -1 |
3.检索方法——includes()和Array.isArray()方法
var data = ['peach', 'pear', 26, '26', 'grape'];
// 从数组下标为3的位置开始检索数字26
console.log(data.includes(26, 3)); // 输出结果:false
// 从数组下标为data.length - 3 的位置查找数字26
console.log(data.includes(26, -3)); // 输出结果:true
// 判断变量data是否为数组
console.log(Array.isArray(data)); // 输出结果:true
4.检索方法——indexOf()方法
indexOf()用于在数组中从指定下标位置,检索到的第一个给定值,存在则返回对应的元素下标,否则返回-1。
下面以判断一个元素是否在指定数组中,若不在则更新数组为例进行讲解
indexOf()方法的第2个参数用于指定开始查找的下标:
var str="Hello world, welcome to the universe.";
var n=str.indexOf("e",5);//在字符串第五个位置开始查找字符 "e" 第一次出现的位置:结果为14
var str="Hello world, welcome to the universe.";
var n=str.indexOf("e");//在字符串查找字符 "e" 第一次出现的位置:1
5.检索方法——lastIndexOf()方法
Array对象提供的lastIndexOf()方法,用于在数组中从指定下标位置检索到的最后一个给定值的下标。与indexOf()检索方式不同的是,lastIndexOf()方法默认逆向检索,即从数组的末尾向数组的开头检索。
接下来以找出指定元素出现的所有位置为例进行讲解。
lastIndexOf()方法的第2个参数用于指定查找的下标,且由于其采用逆向的方式检索:
//查找字符串 "runoob" 最后出现的位置:
var str="I am from runoob,welcome to runoob site.";
var n=str.lastIndexOf("runoob");n 输出结果:28
//从第 20 个字符开始查找字符串 "runoob" 最后出现的位置,:
var str="I am from runoob,welcome to runoob site.";
var n=str.lastIndexOf("runoob", 20);//n 输出结果:10
6.数组转字符串
开发中若需要将数组转换为字符串时,则可以利用JavaScript提供的方法实现。
方法名称 | 功能描述 |
join() | 将数组的所有元素连接到一个字符串中。 |
toString() | 返回一个字符串,表示指定的数组及其元素。 |
var arr = ['a','b','c'];
console.log(arr.join()); // 输出结果:a,b,c
console.log(arr.join('-')); // 输出结果:a-b-c
console.log(arr.toString()); // 输出结果:a,b,c
join()和toString()方法的相同点:
join()和toString()方法的不同点:join()方法可以指定连接数组元素的符号。
7.其他方法
方法名称 | 功能描述 |
sort() | 对数组的元素进行排序,并返回数组。 |
fill() | 用一个固定值填充数组中指定下标范围内的全部元素 |
reverse() | 颠倒数组中元素的位置 |
splice() | 对一个数组在指定下标范围内删除或添加元素 |
slice() | 从一个数组的指定下标范围内拷贝数组元素到一个新数组中 |
concat() | 返回一个合并两个或多个数组后的新数组 |
//数组排序:
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();
//fruits 输出结果:
//Apple,Banana,Mango,Orange
//数字排序(数字和升序):
var points = [40,100,1,5,25,10];
points.sort(function(a,b){return a-b});
//fruits输出结果:
//1,5,10,25,40,100
//数字排序(数字和降序):
var points = [40,100,1,5,25,10];
points.sort(function(a,b){return b-a});
//fruits输出结果:
//100,40,25,10,5,1
//填充 "Runoob" 到数组的最后两个元素:
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.fill("Runoob", 2, 4);
输出结果:
//
//Banana,Orange,Runoob,Runoob
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.reverse();
//fruits 结果输出:
//Mango,Apple,Orange,Banana
//数组中添加新元素:
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.splice(2,0,"Lemon","Kiwi");
//fruits 输出结果:
//Banana,Orange,Lemon,Kiwi,Apple,Mango
//实例
//移除数组的第三个元素,并在数组第三个位置添加新元素:
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.splice(2,1,"Lemon","Kiwi");
//fruits 输出结果:
//Banana,Orange,Lemon,Kiwi,Mango
//实例
//从第三个位置开始删除数组后的两个元素:
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.splice(2,2);
//fruits 输出结果:
//Banana,Orange
var fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];
var citrus = fruits.slice(1,3);
//citrus 结果输出:
//Orange,Lemon
//实例
//连接两个字符串:
var str1 = "Hello ";
var str2 = "world!";
var n = str1.concat(str2);
//n 输出结果:
//Hello world!
练习:
猴子选大王