一、定义
数组(Array),顾名思义:用来存储一组相关值的类型。
数组可以方便地对一组值进行求和、计算平均值、逐项遍历等操作。
java : int[] array = new int[]{1,2,3}
int[] array = {1,2,3}
int[] array = new int[3]
var scoreArr = [87, 89, 93, 71, 100, 68, 94, 88];
二、数组的定义
1、方括号定义法
var arr = ['A', 'B', 'C', 'D'];
2、new定义法
var arr = new Array('A', 'B', 'C', 'D');
// 定义一个长度为 4 的数组,但是这 4 项都是 undefined
var arr = new Array(4);
两种定义方法根据实际需求选择即可,两者的底层都是同样的实现逻辑。
推荐:方括号定义法!
-
如果是定义时就要指定数组的值,那么建议使用:
var arr = ['A', 'B', 'C', 'D'];
-
如果是定义时还不指定数组的值,那么建议使用:
var arr = [];
三、访问数组项
注意:JS 中数组的元素可以是不同的数据类型!
数组每一项都有下标,下标从 0 开始!
可以使用 数组名[下标]
的形式,访问数组的任一项。
四、下标越界
JS 规定,访问数组中不存在的项会返回 undefined
,不会报错!
五、数组的长度
数组的 length
属性表示它的长度。
数组是引用类型,有自己的属性和方法。
var arr = ['A', 'B', 'C', 'D'];
console.log(arr.length); // 4
数组最后一项的下标是数组的长度减 1。
六、更改数组项
-
访问数组项
-
更改数组值
如果更改的数组项超过了 length-1
,则会创造该项。
JS 数组是可以动态扩容的!(和其他语言的区别)
var arr = [1, 2, 3, 4];
arr[6] = 0;
console.log(arr); // [1, 2, 3, 4, undefined, undefined, 0]
七、数组的遍历
数组最大的优点就是方便遍历。
var arr = [1, 2, 3, 4];
for (var i = 0; i < arr.length; i++) {
console.log(arr[i]);
}
var a = ['A', 'B', 'C'];
for (var v of a) {
console.log(v); // 'A', 'B', 'C'
}
八、数组类型的检测
数组用 typeof
检测结果是 object
。
Array.isArray()
方法可以用来检测数组,返回一个布尔值
Array.isArray([1, 2, 3]); // true
Array.isArray([]); // true
九、数组的常用方法
1、数组的头尾操作
方法 | 功能 |
---|---|
push() | 在尾部插入新项 |
pop() | 在尾部删除 |
unshift() | 在头部插入新项 |
shift() | 在头部删除 |
(1)、push()
方法
push()
方法用来在数组末尾推入新项,参数就是要推入的项。
如果要推入多项,可以用逗号隔开。
调用 push()
方法后,数组会立即改变,不需要赋值。
var arr = [22, 33, 44, 55];
arr.push(66);
arr.push(77, 88, 99);
console.log(arr);
// [22, 33, 44, 55, 66, 77, 88, 99]
(2)、pop()方法
与 push() 方法相反,pop()
方法用来删除数组中的最后一项。
()
里没有参数,默认弹出最后一项。
pop()
默认返回最后一项的值。
var arr = [22, 33, 44, 55];
var item = arr.pop();
console.log(arr); // [22, 33, 44]
console.log(item); // 55
(3)、unshift()
方法
unshift()
方法用来在数组头部插入新项,参数就是要插入的项。
如果要插入多项,可以用逗号隔开。
调用 unshift()
方法后,数组会立即改变,不需要赋值。
(4)、shift()
方法
与 unshift() 方法相反,shift()
方法用来删除数组中的开头一项。
()
里没有参数,默认弹出开头一项。
shift()
默认返回开头一项的值。
2、splice()
方法
splice()
方法用于替换数组中的指定项。
由于 splice() 可以实现很多功能,所以也称为 JS 的 “多功能方法”。
//替换项
var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
// 从下标为 3 的项开始,连续替换 2 项。即将 'D', 'E' 替换为 'X', 'Y', 'Z'
arr.splice(3, 2, 'X', 'Y', 'Z');
console.log(arr);
// ['A', 'B', 'C', 'X', 'Y', 'Z', 'F', 'G']
//插入项
var arr = ['A', 'B', 'C', 'D'];
// 从下标为 2 的项开始,连续替换 0 项,即:在 [2] 处插入。
arr.splice(2, 0, 'X', 'Y', 'Z');
console.log(arr);
// ['A', 'B', 'X', 'Y', 'Z', 'C', 'D']
//删除项
var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
// 从下标为 2 的项开始,连续替换 4 项(替换为空,即:删除)。
arr.splice(2, 4);
console.log(arr);
// ['A', 'B', 'G']
splice()
方法会以数组形式返回被替换/删除的项。
var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
// 从下标为 3 的项开始,连续替换 2 项。
var item = arr.splice(3, 2, 'X', 'Y', 'Z');
console.log(arr);
// ['A', 'B', 'C', 'X', 'Y', 'Z', 'F', 'G']
console.log(item);
// ['D', 'E']
var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
// 从下标为 2 的项开始,连续替换 4 项(替换为空,即:删除)。
var item = arr.splice(2, 4);
console.log(arr);
// ['A', 'B', 'G']
console.log(item);
// ['C', 'D', 'E', 'F']
3、slice()
方法
slice()
方法用于得到子数组,类似于字符串中的 slice() 方法。
slice(a, b)
截取的子数组从下标为 a 的项开始,到下标为 b(但不包括下标为 b 的项)结束。
slice(a, b)
方法不会更改原有的数组。
slice()
如果不提供第二个参数,则表示从指定项开始,提取后续所有项作为子数组。
slice()
方法的参数允许为负数,表示数组的倒数第几项(记住不包括最后一项)。
var arr = ['A', 'B', 'C', 'D', 'E', 'F'];
var childArr1 = arr.slice(2, 5);
var childArr2 = arr.slice(2);
var childArr3 = arr.slice(2, -1);
console.log(arr); // ['A', 'B', 'C', 'D', 'E', 'F']
console.log(childArr1); // ['C', 'D', 'E']
console.log(childArr2); // ['C', 'D', 'E', 'F']
console.log(childArr3); // ['C', 'D', 'E']
4、 join()
方法和split()
方法
数组的 join()
方法可以使 数组 转为 字符串。
字符串的 split()
方法可以使 字符串 转为 数组。
-
join()
的参数表示以什么字符作为连接符,如果留空则默认以逗号分隔,如同调用toString()
方法。 -
split()
的参数表示以什么字符拆分字符串,一般不能留空。
[22, 33, 44, 55].join(); // "22,33,44,55"
[22, 33, 44, 55].toString(); // "22,33,44,55"
[22, 33, 44, 55].join(','); // "22,33,44,55"
[22, 33, 44, 55].join('-'); // "22-33-44-55"
[22, 33, 44, 55].join('~'); // "22~33~44~55"
'abcdefg'.split(); // ["abcdefg"]
'abcdefg'.split(''); // ["a", "b", "c", "d", "e", "f", "g"]
'a-b-c-d-e-f-g'.split(''); // ["a", "-", "b", "-", "c", "-", "d", "-", "e", "-", "f", "-", "g"]
'a-b-c-d-e-f-g'.split('-'); // ["a", "b", "c", "d", "e", "f", "g"]
5、字符串和数组更多相关性
字符串也可以使用 [下标]
的形式访问某个字符,等价于 charAt()
方法。
在对字符串中的字符进行遍历时不用转为数组,直接利用 [下标] 即可!
'我爱前端'[0]; // "我"
'我爱前端'[1]; // "爱"
'我爱前端'.charAt(0); // "我"
var str = '我爱前端';
for (var i = 0; i < str.length; i++) {
console.log(str[i]);
}
6、concat()
方法
concat()
方法可以合并连接多个数组(以返回值的形式)。
concat()
方法不会改变原数组。
var arr1 = [1, 2, 3, 4];
var arr2 = [5, 6, 7, 8];
var arr3 = [9, 10, 11];
var arr = arr1.concat(arr2, arr3);
console.log(arr);
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
7、 reverse()
方法
reverse()
方法用来将一个数组中的全部项顺序置反。
var arr = ['A', 'B', 'C', 'D'];
arr.reverse();
console.log(arr); // ["D", "C", "B", "A"]
8、indexOf()
方法和includes()
方法
indexOf()
方法的功能是搜索数组中的元素,并返回它所在的位置,如果元素不存在,则返回 -1。
includes()
方法的功能是判断一个数组是否包含一个指定的值,返回一个布尔值。
['A', 'B', 'C', 'D'].indexOf('C'); // 2
['A', 'B', 'C', 'D'].indexOf('D'); // 3
['A', 'B', 'C', 'D'].indexOf('X'); // -1
['A', 'B', 'B', 'B'].indexOf('B'); // 1
['A', 'B', 'C', 'D'].includes('D'); // true
['A', 'B', 'C', 'D'].includes('X'); // false
注意:indexOf()
及 includes()
方法的判断标准为 ===
全相等!
[11, 22, 33].includes('22'); // false
[11, 22, 33].indexOf('22'); // -1
9、sort()
方法
sort()
方法用原地算法(直接改变原数组)对数组的元素进行排序,并返回数组。
默认排序顺序是将元素转换为字符串,然后根据字典序进行排序(数字 ——> 大写字母 ——> 小写字母,字符串内逐个字符进行比较,相同时比较下一位)
var arr = [3, 18, 10, 24];
console.log(arr.sort()); // [ 10, 18, 24, 3 ]
var arr = ['A', 'a', 'c', 'D', 1];
console.log(arr.sort()); // [ 1, 'A', 'D', 'a', 'c' ]
var arr = ['aa', 'a0', 'aA', 'A1', 'Aa', 'AA'];
console.log(arr.sort()); // [ 'A1', 'AA', 'Aa', 'a0', 'aA', 'aa' ]
sort()
方法可以接收一个函数作为参数,我们可以在这个函数中自定义我们的排序规则:
arr.sort(function(a, b) {
// 比较规则...
});
// 参数a:前一个用于比较的元素。
// 参数b:后一个用于比较的元素。
function(a, b) 返回值 | 排序顺序 |
---|---|
> 0 | a 在 b 后 |
< 0 | a 在 b 前 |
=== 0 | 保持 a 和 b 的顺序 |
//按数字大小进行排序(降序):
var arr = [3, 18, 10, 24];
arr.sort(function(a, b) {
if (a > b) {
return -1;
} else if (a < b) {
return 1;
} else {
return 0;
}
});
console.log(arr); // [ 24, 18, 10, 3 ]