用来存储一组相关的值
方便求和、计算平均数、逐项遍历等操作
typeof–object
Array.isArray(数组)–true;Array.isArray(对象)–false
鸭式辨型(后期讲)
定义数组
定义方法1: var arr = ['A', 'B', 'C', 'D'];//A是数组的项
定义方法2:var arr = new Array('A', 'B', 'C', 'D');
定义方法3:var arr = new Array(4);//长度为4,4项的值皆为undefined
数组下标
下标从0开始
根据下标访问数组项
可以使用方括号中书写下标的形式,访问数组的任一项
var arr = ['A', 'B', 'C', 'D'];
console.log(arr[0]);
console.log(arr[1]);
console.log(arr[2]);
console.log(arr[3]);
注:若访问时下标越界返回undefined
var arr = ['A', 'B', 'C', 'D'];
console.log(arr[4]);//undefined
console.log(arr[1000]);//undefined
console.log(arr[-1]);//undefined
根据下标更改数组项
var arr = [2, 6, 7, 3];
arr[1]++;
arr[2] = 0;
console.log(arr);//[2,7,0,3]
注:若更改时下标越界,则会创造这项
var arr = [2, 6, 7, 3];
arr[6] = 4;
console.log(arr);//[2,6,7,3,empty*2,4]
length属性
表示长度
利用下标&length属性遍历数组
var arr = [2, 6, 7, 3];
for (i = 0; i < arr.length; i++)
console.log(arr[i]);
方法
尾部插入一个/多个元素push()
参数:插入的元素;若插入多个元素用逗号隔开
返回值:数组的新长度
var arr = [2, 6, 7, 3];
var item = arr.push(4, 5);
console.log(item);//6
console.log(arr);//[2,6,7,3,4,5]
尾部删除一个元素pop()
无参数;
返回值:被删除的元素
var arr = [2, 6, 7, 3];
var item = arr.pop();
console.log(item);//3
console.log(arr);//[2,6,7]
头部插入一个/多个unshift()
参数:插入的元素;若插入多个元素用逗号隔开
返回值:数组的新长度
var arr = [2, 6, 7, 3];
var item = arr.unshift(4, 5);
console.log(item);//6
console.log(arr);//[4,5,2, 6, 7, 3]
头部删除一个shift()
无参数;
返回值:被删除的元素
var arr = [2, 6, 7, 3];
var item = arr.shift();
console.log(item);//2
console.log(arr);//[6, 7, 3]
替换、插入、删除splice()
语法:array.splice(index,howmany,item1,.....,itemX)
1.替换指定项–3个参数完备
var arr = [2, 6, 7, 3, 4, 5];
arr.splice(2, 3, 1, 2, 3);
console.log(arr);//[2, 6, 1, 2, 3, 5]
var arr = [2, 6, 7, 3, 4, 5];
arr.splice(2, 5, 1, 2, 3);
console.log(arr);// [2, 6, 1, 2, 3]
var arr = [2, 6, 7, 3, 4, 5];
arr.splice(2, 2, 1, 2, 9);
console.log(arr);//[2, 6, 1, 2, 9, 4, 5]
2.指定位置插入新项–2参为0
var arr = [2, 6, 7, 3, 4, 5];
arr.splice(2, 0, 1, 2, 3);
onsole.log(arr);//[2, 6, 1, 2, 3, 7, 3, 4, 5]
3.删除指定项–省略3参
var arr = [2, 6, 7, 3, 4, 5];
arr.splice(2, 3);
console.log(arr);//[2,6,5]
截取slice()
语法:slice(a,b)
从下标为a的项开始,到下标为b的项结束(不包括下标为b的项)
slice()省略第二个参数,默认到最后一项结束
slice()参数为负时,表示数组的倒数第几项
数组转为字符串join()
参数:字符,表示以什么字符作为连接符;
默认值:逗号;效果同toString()
var arr = [2, 6, 7, 3];
console.log(arr.join());//2,6,7,3
console.log(arr.toString());//2,6,7,3
console.log(arr.join('-'));//2-6-7-3
console.log(arr.join('*'));//2*6*7*3
字符串转为数组split()
参数:字符,以什么字符拆分字符串
var str = 'a-b*c-d*e';
console.log(str.split());//['a-b*c-d*e']
console.log(str.split(''));//['a', '-', 'b', '*', 'c', '-', 'd', '*', 'e']
console.log(str.split('-'));//['a', 'b*c', 'd*e']
console.log(str.split('*'));//['a-b', 'c-d', 'e']
合并连接concat()
var arr1 = [1, 2];
var arr2 = [4, 5, 6];
var arr3 = [7, [8]];
console.log(arr1.concat(arr2, arr3));// [1, 2, 4, 5, 6, 7, [8]]]
翻转reverse()
var arr1 = [1, 2, 7, 8];
console.log(arr1.reverse());//[8, 7, 2, 1]
搜索indexof()、includes()
indexof()搜索数组中的元素,返回位置;若不存在返回-1
includes()判断数组是否包含某值,返回布尔值
排序sort()
数组有sort()方法可以用于数组排序,但是涉及到函数的相关知识,在函数一节课进行介绍。
除内置排序方法外,还有一些排序算法:冒泡排序我们稍后介绍,快速排序在函数一节课介绍。
算法-求最值
var arr = [1, 2, 7, 8];
var min = arr[0];
var max = arr[0];
for (var i = 0; i < arr.length; i++) {
min = arr[i] < min ? arr[i] : min;
max = arr[i] > min ? arr[i] : max;
}
console.log(min);
console.log(max);
算法-去重
利用includes()、 push()
var arr = [3, 4, 2, 3, 4, 1, 5, 8, 2];
var result = [];
for (var i = 0; i < arr.length; i++) {
//若结果数组中无该元素,则推入
if (!result.includes(arr[i])) {
result.push(arr[i]);
}
}
console.log(result);//[3, 4, 2, 1, 5, 8]
算法-随机样本
题目:请随机从原数组中取3项
function getRandomIntInclusive(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1)) + min; //含最大值,含最小值
}
var arr = [3, 4, 2, 3, 4, 1, 5, 8, 2];
var result = [];
//控制取项的个数
for (var i = 0; i < 3; i++) {
//1.生成随机下标
j = getRandomIntInclusive(0, arr.length - 1);
//2.随机下标对应的项插入结果数组
result.push(arr[j]);
//3.删除原数组中的该项
arr.splice(j, 1);
}
console.log(result);
算法-冒泡排序
4个数,共需比3趟,比较次数:3+2+1=6次
n个数,共需比n-1趟,比较次数:n(n-1)/2次
冒泡排序-上浮法
var arr = [6, 5, 4, 3, 2, 1];
//控制趟数
for (var i = 1; i < arr.length; i++) {
//控制比较的次数:最后一项冒泡到相应位置
for (var j = arr.length - 1; j >= i; j--) {
//小的往上(前)冒
if (arr[j] < arr[j - 1]) {
var temp = arr[j - 1];
arr[j - 1] = arr[j];
arr[j] = temp;
}
}
}
console.log(arr);
冒泡排序-下沉法
var arr = [6, 5, 4, 3, 2, 1];
//控制趟数
for (var i = 1; i < arr.length; i++) {
//控制比较的次数:第一项冒泡到相应位置
// 第1趟--比较n-1次
// 第2趟--比较n-2次
for (var j = 0; j <= arr.length - i; j++) {
//大的往下(后)沉
if (arr[j] > arr[j + 1]) {
var temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
console.log(arr);
算法-二维数组
数组作为数组元素
var matrix = [
[12, 13, 14],
[23, 24, 25],
[31, 35, 38],
[43, 44, 45]
]
console.log(matrix.length);//4
//遍历二维数组
for (i = 0; i < matrix.length; i++) {
for (j = 0; j < matrix[i].length; j++)
console.log(matrix[i][j]);
}
算法-复制数组
var arr2=arr1
不能复制数组,该如何呢
浅克隆-一维数组- push()
只能克隆第一层
var arr = [1, 2, 3, 4];
var result = [];
for (var i = 0; i < arr.length; i++) {
result.push(arr[i]);
}
console.log(result);//[1, 2, 3, 4]
//两数组的址不同意味着实现了赋值
console.log(result == arr);//false
//改变原数组的值,新数组的值不会变
arr.push(5);
console.log(result);//[1, 2, 3, 4]
深克隆-多维数组-藕断丝连问题
若是多维数组,或数组中的项是其他引用类型值,要使用递归技术,在后面课程介绍
var arr = [1, 2, 3, [4, 5, 6]];
var result = [];
for (i = 0; i < arr.length; i++) {
result.push(arr[i]);
}
console.log(result == arr);//false藕断
console.log(result[4] == arr[4]);//true丝连
辨析数组、字符串
字符串也可以使用方括号内写下标的形式,访问某个字符,等价于charAt()方法
字符串的一些算法问题有时候会转换为数组解决