一、什么是数组
内存中连续多个数据的数据结构,再起一个统一的名字。
数组也是一个对象,和我们普通的对象功能类似,也是用来储存一些值的。不同的是普通对象是使用字符串作为属性名的,而数组使用数字作为索引操作元素。
数组的存储性能比普通对象要好,在开发中我们经常使用数组来存储一些数据。
使用 typeof 检查数组的数据类型时就会返回 object 对象类型。
为什么要使用数组:
普通的变量只能存储一个数据程序(数据程序 = 数据结构 + 算法)
算法:解决问题的步骤
数据结构:数据在内存中的存储结构,好的数据结构可以极大的提高程序的执行效率
什么时候使用数组:
只要存储多个连续的数据就使用数组
二、创建数组
(一)创建空数组:2种
1、数组字面量:
语法: var arr = [ ];
var arr = [ ]; //意味着创建一个不包含元素的数组
var arr = [12,13,14]; //意味着创建一个包含三个元素的数组
2、使用构造函数:
语法:var arr = new Array();
var arr = new Array(); //定义一个不包含元素的数组
var arr = new Array('Aa','Bb','Cc'); //定义一个三个字符串元素的数组
在创建数组时,还不知道数组里面的元素内容时。
(二)创建数组的同时初始化
1、数组字面量:var arr = [元素1,元素2…];
2、用 new Array方法:var arr = new Array(元素1,元素2,…)
在创建数组时,如果已经知道了数组里面的元素内容,就可以使用创建数组并同时进行初始化这种方式。
var array = [111,222,333];
var array = new Array(111,222,333);
(三)先声明空数组,再添加元素
直接量
var arr = [ ];
arr[0] = 'aaa';
arr[1] = 'bbb';
new Array方法
var arr = new Array();
arr[0] = '安安';
arr[1] = 111;
arr[3] = true;
上面这种既有字符串又有数字,还有布尔值的数组,称之为混合类型的数组。
三、访问数组中的元素
元素:数组中的每个数据都是元素
如何访问:下标,数组中唯一标识每个元素储存位置的序号。
索引:从0开始的整数就是索引;索引(index)一个索引对应一个值,这一个整体称之为元素。
特点:从0 开始,连续不重复
何时:如果想访问数组元素只能,使用下标
语法:数组名[ i ] (用法和单个变量完全一样)
数组GET操作和SET操作
(一)设置数组元素的值——SET
1、向数组中添加元素
语法:数组[索引] = 值;
var arr = new Array();
arr[0] = 10;
arr[1] = 33;
arr[2] = 22;
arr[3] = 44;
console.log(arr);
注意:10在索引为0的位置,33在索引为1的位置,索引都是从0开始的
2、向数组中修改添加元素
var ss = [98,22,100];
ss[2] = 60; //将值为100的元素重新赋值为60;
ss[3] = 75; //在元素的尾部添加一个新的元素;
注意:索引从0 开始,最大到 length-1;
(二)获取数组元素的值——GET
语法: 数组[索引]
1、读取数组中的元素
注意:如果读取不存在的索引,他不会报错而是返回 undefined
var arr = new Array();
arr[0] = 10;
arr[1] = 33;
arr[2] = 22;
console.log(arr[2]);
console.log(arr[4]);
(三)数组的 length 属性:
(获取数组的元素个数)
记录了数组中理论上的元素的个数,length 的值永远都是最大下标 +1
语法:数组.length
length 设置或是获取数组的长度 (检查有几个元素,元素个数)
1、对连续的数组使用length,可以获得数组中元素的个数(连续的数组——缩印按照顺序排列0、1、2、3、…)
var arr = new Array();
arr[0] = 10;
arr[1] = 33;
arr[2] = 22;
arr[3] = 44;
console.log(arr.length);
2、对非连续的数组,length的数组长度为最大索引+1(假设最大索引是98,那么数组.length的结果就是99)
var arr = new Array();
arr[0] = 10;
arr[1] = 33;
arr[2] = 22;
arr[3] = 44;
arr[10]= 99;
console.log(arr.length);
console.log(arr);
(修改length)
1、如果修改的 length 大于数组原来长度,则多出的部分会空出来
var arr = new Array();
arr[0] = 10;
arr[1] = 33;
arr[2] = 22;
arr[3] = 44;
arr.length = 10;
console.log(arr.length);
console.log(arr);
2、如果修改的 length 小于原长度,则多出的元素会被删除(可以通过length来删除元素)
var arr = new Array();
arr[0] = 10;
arr[1] = 33;
arr[2] = 22;
arr[3] = 44;
arr.length = 2;
console.log(arr.length);
console.log(arr);
(向数组最后一个位置添加元素)
语法: 数组[数组.length] = 值;
注意: 如果 [ ] 里不加数组名,那么就是到全局中去找length(假设数组的最大索引为3,就要往4加。如果想往数组再添加顺序索引内容,就要比最大索引 + 1)。
var arr = new Array();
arr[0] = 10;
arr[1] = 33;
arr[2] = 22;
arr[3] = 44;
arr[arr.length] = 77;
arr[arr.length] = 88;
arr[arr.length] = 99;
console.log(arr.length);
console.log(arr);
四、数组遍历
遍历数组的元素,通常选用 for 循环语句,元素的检索(下标)作为循环变量
元素索引从0开始,到 length-1 结束
var arr = [12,13,14,15,16]
for(var i = 0;i<arr.length;i++){
arr[i] += 10;
}
console.log(arr);
length总结:
获得数组的最后一个元素:arr[arr.length - 1]
获得倒数第n个元素的位置:arr[arr.length - n]
数组缩容:减小 arr.length 的数值,会删除结尾的多余元素
遍历数组:依次访问数组中的每个元素,对每个元素执行相同的操作
for(var i = 0;i<arr.length;i++){
arr[i] //当前正在遍历的元素
}
五、数组类型
(一)索引数组:下标为数字的数组
数组特殊的特点:三个不限制
1、不限制数组元素的个数:长度可变
2、不限制下标越界
获取元素:不报错!返回undefined
修改元素值:不报错!自动在指定位置创建新元素,并自动修改length属性值为最大索引 +1;
修改length属性为最大索引 +1;
如果索引不连续的数组——稀疏数组
3、不限制元素的数据类型
(二)关联数组:可以自定义下标名称的数组
为什么使用关联数组
索引数组中的下标没有明确的意义;
hash数组可以实现元素的快速增删,查找,
什么时候使用关联数组
只有希望每个元素都有专门的名称的时候,就使用关联数组;
1、关联数组的创建方式
如何创建关联数组(两步)
第一步:创建空数组
第二步:向空数组中添加新元素,并且自定义下标名称。
var name = [ ];
name['xiaoming'] = '小明';
name['hanhan'] = '憨憨';
2、关联数组的遍历
由于关联数组的 length 属性值无法获取其中元素的数量,所以遍历关联数组只能使用for … in循环
for( var key in hash){
key //只是元素的下标名
aa[key] //当前元素值
}
(三)索引数组和关联数组的对比
索引数组:
1、以字符串输出
2、索引是数字
3、length属性有效
4、访问元素,都用数组名['索引']
5、可以 for 循环遍历
关联数组:
1、不能使用字符串输出
2、下标是自定义的字符串
3、length属性失效(=0)
4、不能用 for 循环遍历,需要使用 for … in循环
索引数组和关联数组的查找
总结:如果只要希望快速查找元素的时候,就使用hash数组
六、数组的空位
当数组的某个位置为空元素(即两个逗号之间没有任何值),则称这个数组存在空位(hole)。
数组的空位不会影响length的值;
var arr = [1,2,3,,4];
console.log(arr.length);
注意:如果最后一个元素后面有逗号,并不会产生空位,即有没有这个逗号,结果都是一样的。
下面例子中,数组的最后一个成员后面有一个逗号,这并不影响length属性的值,与没有逗号的时候是一样滴。
var arr = [1,2,3,];
console.log(arr.length);
数组的空位是可以读取的,结果返回undefined
使用 delete 命令删除一个数组成员,会形成空位,并且不会影响 length 属性。
使用delete 命令删除了数组第二个元素,这个位置就形成了空位,但是产生空位之后对length属性是没有影响的。
也就是说,length属性是不过滤空位的。所以如果想使用length属性进行数组遍历,要小心可能会出现空位现象。
数组的某个位置的空位,与某个位置是undefined,是两种不同的情况。如果是空位,使用数组的forEach方法、for…in结构、Object.keys方法进行遍历,空位都会被跳过。
var a = [, , ,];
a.forEach(function (x, i) {
console.log(i + '. ' + x);
})
没有任何输出
for (var i in a) {
console.log(i);
}
// 不产生任何输出
Object.keys(a)
// []
当某个位置是undefined的时候,遍历的时候就不会被跳过;
var a = [undefined, undefined, undefined];
a.forEach(function (x, i) {
console.log(i + '. ' + x);
});
// 0. undefined
// 1. undefined
// 2. undefined
for (var i in a) {
console.log(i);
}
// 0
// 1
// 2
Object.keys(a)
// ['0', '1', '2']
空位就相当于数组中没有这个元素,所以不会被遍历到;
undefined则表示数组中有这个元素,只是值是undefined,所以遍历不会跳过;
实例一:
求取数组的和平均值
实现步骤:
先声明 一个求和变量 sum;
遍历这个数组。把里面每个数组元素加到 sum里面;
用求和变量 sum 除以数组的长度就可以得到数组的平均值;(想要输出多个变量,使用逗号分隔即可)
var arr=[2,6,1,7,4]; var sum = 0; var average = 0; for(var i =0;i< arr.length;i++){ sum += arr[i]; } average = sum / arr.length; console.log(sum,average);
实例二:
求取数组中的最大值
实现步骤:
声明一个保存最大元素的变量 max;
默认最大值也可以取数组中的第一个元素。
遍历这个数组,并把里面的每个数组元素和 max相比较。
如果这个数组元素大于 max的值,那么就将这个数组元素存到 max里面,否则继续进行下一轮比较;
最后输出最大值 max;
(如何去理解呢,可以理解为擂台赛,一个人在擂台守擂(守擂的人就相当是最大值),其他人与他较量,如果赢了,就代替原来的人守擂,就是最厉害的(最大值))
var arr=[2,5,9,34,1,89,50]; var max=arr[0]; for(var i=1;i<arr.length;i++){ if(arr[i] > max){ max=arr[i]; } }console.log(max);
还可以用三元运算符代替 if 语句:
补充:三元运算符
语法:表达式1?表达式2:表达式3
表达式1是条件,值为 Boolean类型;
若表达式 1的值为 true,则执行表达式 2 的操作,并且以表达式 2的结果为整个表达式的结果;
若表达式 1的值为 false,则执行表达式 3 的操作,并且以表达式 3的结果为整个表达式的结果;
下面的三元运算语句含义为:
如果 arr[i]<max (数组中的元素小于max)为 真true,则变量max的值还是原来的不变;
如果 arr[i]<max (数组中的元素小于max)为 假false,则变量max的值变成 arr[i]的结果;
var arr=[2,5,9,34,1,89,50]; var max=arr[0]; for(var i=1;i<arr.length;i++){ max = arr[i] < max?max:arr[i]; }console.log(max);
实例三:
求取数组中的最小值,和求取数组中的最大值思路一致。只需要换个符号就可以了。
var arr=[2,5,9,34,1,89,50]; var min=arr[0]; for(var i=1;i<arr.length;i++){ if(arr[i]<min){ min=arr[i]; } }console.log(min);
或者是使用三元运算符,返回结果也是一样的。
var arr=[2,5,9,34,1,89,50]; var min=arr[0]; for(var i=1;i<arr.length;i++){ min = arr[i] < min?arr[i]:min; }console.log(min);
实例四:
数组转换成字符串,并使用符号分隔
实现步骤:
需要一个新的变量用于存放转换完之后的字符串 str
遍历原来的数组,分别把里面的数据取出来,加到字符串里。
同时在后面多加一个分隔符号;
var arr=["yi","er","san","si","wu"]; var str=''; var sep='/'; for(var i=0;i< arr.length;i++){ str += arr[i]+sep; } console.log(str,typeof(str));