本文系统讲解 JavaScript 中 Array 对象的核心用法,涵盖数组的定义方式与 length 属性。详细解析 concat、every、filter、forEach、indexOf、join、map、pop、push、reverse、shift、slice、sort、splice、toString、unshift 等常用实例方法,以及 Array.isArray 静态方法。同时提供索引访问、for 循环遍历、浅度与深度复制及数组相等性判断的实际操作示例,帮助开发者掌握数组处理技巧。
JavaScript Array 对象概述
本文详细解析了 JavaScript 中的 Array 数组对象,具体内容包括以下部分。
目录概览: 1. 基础介绍:阐述 Array 数组对象的定义、创建方式及核心属性。
2. 实例方法:全面介绍 Array 对象的常用实例方法,包括 concat、every、filter、forEach、indexOf、join、lastIndexOf、map、pop、push、reverse、shift、slice、sort、splice、toString 和 unshift。
3. 静态方法:讲解 Array 对象的静态方法 Array.isArray()。
4. 实战应用:通过示例演示数组的索引访问、for 循环遍历、浅度复制与深度复制等操作。
Array 基础介绍
一、基础介绍 1.1 概念说明
数组是一组有序值的集合。其中的每个值被称为元素,每个元素在数组中都有一个对应的数字位置,即索引。JavaScript 中的数组是无类型的:数组元素可以是任意类型的数据,且同一个数组中的不同元素可以拥有不同的数据类型。——摘自《JavaScript权威指南(第六版)》
1.2 创建方式
var names = new Array("张三", "李四", "王五");
//或者
var names = ["张三", "李四", "王五"];
1.3 核心属性
length:用于表示数组中包含的元素数量。
Array 实例方法详解
二、实例方法 以下是常用的数组实例方法:
1) unshift():用于在数组头部插入一个或多个元素。
2) shift():用于移除并返回数组的第一个元素。
3) push():用于在数组尾部添加一个或多个元素。
4) pop():用于移除并返回数组的最后一个元素。
2.1 concat():用于将多个值或数组连接到原数组中。该方法不会修改原数组,而是返回一个新数组。
参数说明:
①value1, value2, ..., valueN:可以是任意数量的值。
返回值说明:
{Array} 返回一个新数组,该数组包含原数组的元素以及新添加的元素。
示例代码:
var demoArray = ['a', 'b', 'c'];
var demoArray2 = demoArray.concat('e');
console.log(demoArray); // => demoArray:['a','b','c'] 原数组不发生变更
console.log(demoArray2); // => ['a','b','c','e']
2.2 every():依次遍历数组中的每个元素,判断是否所有元素都满足指定条件(返回 true)。
参数说明:
①function(value, index, self) {}:对每个元素调用此函数以判断是否为 true。一旦遇到返回 false 的元素,遍历立即停止。
value:当前遍历到的数组元素。
index:当前元素的索引序号。
self:数组本身。
返回值说明:
{Boolean}:仅当所有元素都返回 true 时,结果才为 true;只要有一个元素返回 false,结果即为 false。
示例代码:
var demoArray = [1, 2, 3];
var rs = demoArray.every(function (value, index, self) {
return value > 0;
});
console.log(rs); // => true
2.3 filter():依次遍历数组元素,返回包含所有符合条件元素的新数组。
参数说明:
①function(value, index, self) {}:对每个元素依次调用此函数,筛选出符合条件的元素并返回新数组。
value:当前遍历到的数组元素。
index:当前元素的索引序号。
self:数组本身。
返回值说明:
{Array} 返回一个包含所有符合条件元素的新数组。
示例代码:
var demoArray = [1, 2, 3];
var rs = demoArray.filter(function (value, index, self) {
return value > 0;
});
console.log(rs); // => [1, 2, 3]
2.4 forEach():依次遍历数组元素,对每个元素执行指定的回调函数;该方法没有返回值。
参数说明:
①function(value, index, self) {}:对每个元素依次调用此函数。
value:当前遍历到的数组元素。
index:当前元素的索引序号。
self:数组本身。
返回值说明:无。
示例代码:
var demoArray = [1, 2, 3];
demoArray.forEach(function (value, index, self) {
console.log(value); // => 依次输出:1 2 3
});
2.5 indexOf():在数组中查找匹配的元素。如果找不到匹配项,则返回 -1。查找时使用严格相等运算符 '===',因此需要区分数字 1 和字符串 '1'。
参数说明:
①value:要在数组中查找的目标值。
②start:开始查找的索引位置,如果省略,则默认从 0 开始。
返回值说明:
{Int}:返回数组中第一个匹配 value 的索引;若不存在,返回 -1。
示例代码:
['a', 'b', 'c'].indexOf('a'); // =>0
['a', 'b', 'c'].indexOf('a', 1); // =>-1
['a', 'b', 'c'].indexOf('d'); // =>-1
[1, 2, 3].indexOf('1'); // => -1 :采用的'==='匹配方式
2.6 join():使用指定的分隔符将数组中的所有元素拼接成一个字符串。
参数说明:
①separator {String}:各元素之间的分隔符,如果省略,默认使用英文逗号 ',' 作为分隔符。
返回值说明:
{String}:返回以 separator 为分隔符,将所有元素拼接而成的字符串。
示例代码:
['a', 'b', 'c'].join(); // => 'a,b,c'
['a', 'b', 'c'].join('-'); // => 'a-b-c'
2.7 lastIndexOf():从数组末尾开始反向查找匹配的元素。如果找不到匹配项,则返回 -1。查找时使用严格相等运算符 '===',因此需要区分数字 1 和字符串 '1'。
参数说明:
①value:要在数组中查找的目标值。
②start:开始查找的索引位置,如果省略,则从最后一个元素开始向前查找。
返回值说明:
{Int}:从右向左查找,返回数组中第一个匹配 value 的索引;若不存在,返回 -1。
示例代码:
['a', 'b', 'c'].lastIndexOf('a'); // => 0
['a', 'b', 'c'].lastIndexOf('a', 1); // => 0
['a', 'b', 'c'].lastIndexOf('d'); // => -1
[1, 2, 3].lastIndexOf('1'); // => -1 :采用的'==='匹配方式
2.8 map():依次遍历数组元素,对每个元素执行计算函数,并返回包含计算结果的新数组。
参数说明:
①function(value, index, self) {}:对每个元素依次调用此函数,返回计算后的元素。
value:当前遍历到的数组元素。
index:当前元素的索引序号。
self:数组本身。
返回值说明:
{Array} 返回一个包含所有计算后元素的新数组。
示例代码:
[1, 2, 3].map(function (value, index, self) {
return value * 2;
}); // => [2, 4, 6]
2.9 pop():移除并返回数组的最后一个元素。
参数说明:无。
返回值说明:
{Object} 返回数组的最后一个元素;如果数组为空,则返回 undefined。
示例代码:
var demoArray = ['a', 'b', 'c'];
demoArray.pop(); // => c
demoArray.pop(); // => b
demoArray.pop(); // => a
demoArray.pop(); // => undefined
2.10 push():将一个或多个元素添加到数组的尾部。
参数说明:
①value1, value2, ..., valueN:任意数量的值,将被添加到数组尾部。
返回值说明:
{int} 返回数组更新后的新长度。
示例代码:
var demoArray = ['a', 'b', 'c'];
demoArray.push('d'); // => 4, demoArray : ['a', 'b', 'c', 'd']
demoArray.push('e', 'f'); // => 6, demoArray :['a', 'b', 'c', 'd', 'e', 'f']
console.log(demoArray); // => ['a', 'b', 'c', 'd', 'e', 'f']
2.11 reverse():反转数组中元素的顺序。
参数说明:无。
返回值说明:无(该方法直接在原数组内反转元素顺序,不返回新数组)。
示例代码:
var demoArray = ['a', 'b', 'c', 'd', 'e'];
demoArray.reverse();
console.log(demoArray); // => ["e", "d", "c", "b", "a"]
2.12 shift():移除并返回数组的第一个元素。
参数说明:无。
返回值说明:
{Object} 返回数组的第一个元素;如果数组为空,则返回 undefined。
示例代码:
var demoArray = ['a', 'b', 'c'];
demoArray.shift(); // => a
demoArray.shift(); // => b
demoArray.shift(); // => c
demoArray.shift(); // => undefined
2.13 slice(startIndex, endIndex):返回数组的一部分切片。
参数说明:
①startIndex:开始切片的索引;如果为负数,表示从尾部开始计算,-1 代表最后一个元素,-2 代表倒数第二个,依此类推。
②endIndex:结束切片的索引(不包含该位置的元素),如果未指定,则截取到数组末尾。截取的元素不包含 endIndex 索引处的元素,即截取范围为此处索引的前一个元素。
返回值说明:
{Array} 返回一个新数组,包含从 startIndex 到 endIndex 前一个元素的所有元素。
示例代码:
[1, 2, 3, 4, 5, 6].slice(); // => [1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6].slice(1); // => [2, 3, 4, 5, 6] :从序号1开始截取
[1, 2, 3, 4, 5, 6].slice(0, 4); // => [1, 2, 3, 4] :截取序号0到序号3(序号4的前一个)的元素
[1, 2, 3, 4, 5, 6].slice(-2); // => [5, 6] :截取后面的2个元素
2.14 sort(opt_orderFunc):按照指定规则对数组元素进行排序。
参数说明:
①opt_orderFunc(v1, v2) {Function}:可选的排序规则函数。如果省略,默认将元素转换为字符串并按字母顺序从小到大排序。
v1:比较时前面的元素。
v2:比较时后面的元素。
排序规则:
比较 v1 和 v2,返回一个数字来表示排序顺序:
小于 0:表示 v1 应排在 v2 前面。
等于 0:表示 v1 和 v2 相等,保持原有相对顺序。
大于 0:表示 v1 应排在 v2 后面。
返回值说明:无(该方法直接在原数组内进行排序操作,不返回新数组)。
示例代码:
[1, 3, 5, 2, 4, 11, 22].sort(); // => [1, 11, 2, 22, 3, 4, 5] :这里都元素都被转换为字符,11的字符在2前
[1, 3, 5, 2, 4, 11, 22].sort(function (v1, v2) {
return v1 - v2;
}); // => [1, 2, 3, 4, 5, 11, 22] :从小到大排序
[1, 3, 5, 2, 4, 11, 22].sort(function (v1, v2) {
return -(v1 - v2); //取反,就可以转换为 从大到小
}); // => [22, 11, 5, 4, 3, 2, 1]
2.15 splice():用于插入、删除或替换数组元素。
参数说明:
①start {int}:开始插入、删除或替换操作的起始索引。
②deleteCount {int}:要删除的元素个数,从 start 索引处开始计算。
③value1, value2, ..., valueN {Object}:可选参数,表示要插入的元素,从 start 索引处开始插入。如果参数 ② 不为 0,则先执行删除操作,再执行插入操作。
返回值说明:
{Array} 返回一个包含被删除元素的新数组。如果参数 ② 为 0,表示没有元素被删除,则返回一个空数组。
示例代码:
// 1.删除
var demoArray = ['a', 'b', 'c', 'd', 'e'];
var demoArray2 = demoArray.splice(0, 2); // 删除从序号从0开始的2个元素,返回包含删除元素的数组:['a', 'b']
console.log(demoArray2); // => ['a', 'b']
console.log(demoArray); // => ['c', 'd', 'e']
// 2.插入
var demoArray = ['a', 'b', 'c', 'd', 'e'];
var demoArray2 = demoArray.splice(0, 0, '1', '2', '3'); // ②参为0,返回空数组
console.log(demoArray2); // => [ ]
console.log(demoArray); // => ['1', '2', '3', 'a', 'b', 'c', 'd', 'e']
// 3.先删除再插入
var demoArray = ['a', 'b', 'c', 'd', 'e'];
// 当②参不为0,那么先执行删除操作(删除序号从0开始的4个元素,返回包含被删除元素的数组),再执行插入操作
var demoArray2 = demoArray.splice(0, 4, '1', '2', '3');
console.log(demoArray2); // => ['a', 'b', 'c', 'd']
console.log(demoArray); // => ['1', '2', '3', 'a', 'b', 'c', 'd', 'e']
2.16 toString():将数组中所有元素通过英文逗号 ',' 拼接为一个字符串。
参数说明:无。
返回值说明:
{String} 返回由数组所有元素通过英文逗号 ',' 拼接而成的字符串。其效果与调用无参的 join() 方法相同。
示例代码:
[1, 2, 3, 4, 5].toString(); // => '1,2,3,4,5'
['a', 'b', 'c', 'd', 'e'].toString(); // => 'a,b,c,d,e'
2.17 unshift():在数组头部插入一个或多个元素。
参数说明:
①value1, value2, ..., valueN:任意数量的值,将被添加到数组头部。
返回值说明:
{int} 返回数组更新后的新长度。
示例代码:
var demoArray = [];
demoArray.unshift('a'); // => demoArray:['a']
demoArray.unshift('b'); // => demoArray:['b', 'a']
demoArray.unshift('c'); // => demoArray:['c', 'b', 'a']
demoArray.unshift('d'); // => demoArray:['d', 'c', 'b', 'a']
demoArray.unshift('e'); // => demoArray:['e', 'd', 'c', 'b', 'a']
Array 静态方法
三、静态方法 3.1 Array.isArray():用于判断一个对象是否为数组。
参数说明:
①value {Object}:任意类型的对象。
返回值说明:
{Boolean} 返回判断结果。当返回 true 时,表示该对象是数组;当返回 false 时,表示该对象不是数组。
示例代码:
Array.isArray([]); // => true
Array.isArray(['a', 'b', 'c']); // => true
Array.isArray('a'); // => false
Array.isArray('[1, 2, 3]'); // => false
Array 实际操作示例
四、实际操作 4.1 索引访问
说明:每个元素在数组中都有一个位置,以数字表示,称为索引。索引从 0 开始计数,即第一个元素的索引为 0,第二个元素的索引为 1,依此类推。
当访问一个不存在的数组索引时,返回 undefined。
示例代码:
var demoArray = ['a', 'b', 'c', 'd', 'e'];
demoArray[0]; // => 获取第一个元素:'a'
demoArray[0] = 1; // 设置第一个元素为 1
console.log(demoArray); // => demoArray:[1, 'b', 'c', 'd', 'e']
console.log(demoArray[9]); // => undefined :当获取的索引不存在时,返回 undefined
4.2 for 循环遍历
说明:可以通过 for 语句逐个遍历数组中的元素。
示例代码:
var demoArray = ['a', 'b', 'c', 'd', 'e'];
for (var i = 0, length = demoArray.length; i < length; i++) {
console.log(demoArray[i]); // => 逐个输出数组内的元素
}
4.3 浅度复制
说明:Array 类型是引用类型;当将数组 a 赋值给数组 b 时,如果修改数组 b 的元素,数组 a 也会发生相应的变化。
示例代码:
var demoArrayA = ['a', 'b', 'c', 'd', 'e'];
var demoArrayB = demoArrayA; // 把数组A 赋值给数组B
demoArrayB[0] = 1; // 对数组B 的元素进行修改
console.log(demoArrayA); // => [1, 'b', 'c', 'd', 'e']:数组A 的元素也发生了变更
4.4 深度复制
说明:使用 concat() 方法可以返回一个新数组;这种方式可以防止浅度复制带来的副作用,即对数组 b 进行元素修改时,数组 a 不会发生变更。
示例代码:
var demoArrayA = ['a', 'b', 'c', 'd', 'e'];
var demoArrayB = demoArrayA.concat(); // 使用concat()方法,返回新的数组
demoArrayB[0] = 1; // 对数组B 的元素进行修改
console.log(demoArrayA); // => ['a', 'b', 'c', 'd', 'e']:数组A 的元素没变更
console.log(demoArrayB); // => [ 1, 'b', 'c', 'd', 'e']:数组B 的元素发生了变更
4.5 判断两个数组是否相等
说明:由于 Array 是引用类型,即使两个空数组 [] === [] 也会返回 false。因此,可以通过比较数组 toString() 方法返回的字符串来判断两个数组是否相等。
示例代码:
console.log([]===[]); // => false
console.log(['a', 'b'] === ['a', 'b']); // => false
console.log(['a', 'b'].toString() === ['a', 'b'].toString()); // true
以上就是本文的全部内容,希望对大家学习 JavaScript Array 对象有所帮助。