Skip to content

数组方法有哪些?

一、数组基础概念

  • 定义: JavaScript 中的一种对象,用于存储有序数据集合。
  • 特点:
    1. 元素有序,可通过索引访问。
    2. 支持不同类型混合存储。
    3. 长度可动态变化。
  • 判断数组:
js
Array.isArray(arr); // 推荐
arr instanceof Array; // 可用
Object.prototype.toString.call(arr); // "[object Array]"

二、ES5 常用方法

方法功能示例是否修改原数组
push尾部添加元素[1,2].push(3)[1,2,3]
pop尾部删除元素[1,2,3].pop()[1,2]
unshift头部添加元素[1,2].unshift(0)[0,1,2]
shift头部删除元素[0,1,2].shift()[1,2]
splice任意位置增删改[1,2,3].splice(1,1,'a')[1,'a',3]
sort排序[3,1,2].sort()[1,2,3]
reverse反转[1,2,3].reverse()[3,2,1]
concat合并数组[1,2].concat([3,4])[1,2,3,4]
slice截取数组[1,2,3].slice(0,2)[1,2]
forEach遍历数组[1,2,3].forEach(x=>console.log(x))
map返回新数组[1,2,3].map(x=>x*2)[2,4,6]
filter返回满足条件的数组[1,2,3].filter(x>1)[2,3]
reduce归并计算[1,2,3].reduce((a,b)=>a+b,0) → 6
indexOf查找元素索引[1,2,3].indexOf(2) → 1
lastIndexOf查找最后索引[1,2,2].lastIndexOf(2) → 2

三、ES6 新增方法

方法功能示例是否修改原数组
find返回第一个满足条件的元素[1,2,3].find(x>1) → 2
findIndex返回满足条件元素索引[1,2,3].findIndex(x>1) → 1
includes是否包含元素[1,2,3].includes(2) → true
Array.from()类数组转数组Array.from('abc')['a','b','c']
Array.of()创建数组Array.of(1,2,3)[1,2,3]
扩展运算符 ...展开数组[...arr1, ...arr2]
entries()返回 [index,value] 迭代器for(let [i,v] of arr.entries())
keys()返回索引迭代器for(let i of arr.keys())
values()返回值迭代器for(let v of arr.values())
flat扁平化数组[1,[2,[3]]].flat()[1,2,[3]]
flatMapmap + 扁平化[1,2,3].flatMap(x=>[x,x*2])[1,2,2,4,3,6]

四、ES7(ES2016)新增方法

方法功能示例是否修改原数组
includes判断数组是否包含某元素[1,2,3].includes(2) → true

WARNING

⚠️ ES7 核心新增方法主要是 includes,其他操作方法已在 ES6 提供。

五、原数组是否被破坏总结

方法类型方法示例是否破坏原数组
修改原数组push, pop, shift, unshift, splice, sort, reverse, copyWithin, fill
不修改原数组concat, slice, map, filter, reduce, find, findIndex, includes, flat, flatMap

六、前端面试常见拓展题

💬Q1: 如何判断一个变量是数组?

考察点:数组类型判断方法

js
Array.isArray([])                  // true ✅ 推荐
[] instanceof Array                // true
Object.prototype.toString.call([]) // "[object Array]"

💬Q2: 数组的浅拷贝和深拷贝有哪些方法?

考察点:数组引用类型拷贝原理 答案/解析:

  • 浅拷贝:只复制第一层,内部对象引用不变

    js
    let arr = [1, 2, [3, 4]];
    let shallow = [...arr];
    shallow[2][0] = 100;
    console.log(arr); // [1,2,[100,4]]
  • 深拷贝:复制所有层,独立

    js
    let deep = JSON.parse(JSON.stringify(arr));
    deep[2][0] = 200;
    console.log(arr); // [1,2,[100,4]]

💬Q3: 数组去重有哪些方法?

考察点:数组操作技巧

js
let arr = [1, 2, 2, 3, 3, 3];
// 方法1:Set
let unique = [...new Set(arr)]; // [1,2,3]
// 方法2:filter + indexOf
let unique2 = arr.filter((v, i, a) => a.indexOf(v) === i); // [1,2,3]

💬Q4: 如何扁平化多层数组?

考察点:ES6/ES7 新特性

js
let nested = [1, [2, [3]]];
nested.flat(); // [1,2,[3]]  默认扁平一层
nested.flat(2); // [1,2,3]   扁平两层,多层infinity
nested.flatMap((x) => [x, x * 2]); // [1,2,2,4,3,6]

💬Q5: 数组排序的注意事项?

考察点:sort 默认行为、排序函数

js
let arr = [10, 1, 5];
arr.sort(); // ['1','10','5'] 字符串排序
arr.sort((a, b) => a - b); // [1,5,10] 数字排序

💬Q6: 数组合并的方式有哪些?

考察点:数组扩展、性能考虑

js
let a = [1, 2];
let b = [3, 4];
// 方法1:concat
let c1 = a.concat(b); // [1,2,3,4]
// 方法2:ES6 扩展运算符
let c2 = [...a, ...b]; // [1,2,3,4]

💬Q7: 数组查找元素的方法有哪些?

考察点:查找方法及返回值

js
let arr = [1, 2, 3, 4];
arr.indexOf(3); // 2
arr.lastIndexOf(2); // 1
arr.find((x) => x > 2); // 3
arr.findIndex((x) => x > 2); // 2
arr.includes(2); // true

💬Q8: 如何判断数组是否为空?

考察点:数组长度判断

js
let arr = [];
if (arr.length === 0) {
  console.log("数组为空");
}

💬Q9: 数组查找最大值/最小值

考察点:数组操作技巧

js
let arr = [5, 2, 9, 1];
Math.max(...arr); // 9
Math.min(...arr); // 1

💬Q10: 数组去重 + 排序组合

考察点:链式操作、ES6 特性

js
let arr = [3, 1, 2, 3, 2];
[...new Set(arr)].sort((a, b) => a - b); // [1,2,3]

💬Q11: : 如何判断数组中至少有一个元素满足条件?

考察点:some 方法

js
let arr = [1, 2, 3];
arr.some((x) => x > 2); // true

💬Q12: 如何判断数组中所有元素满足条件?

考察点:every 方法

js
let arr = [2, 4, 6];
arr.every((x) => x % 2 === 0); // true

💬Q13: 数组链式操作示例

考察点:数组方法组合、链式操作

js
let res = [1, 2, 3, 4].map((x) => x * 2).filter((x) => x > 4); // [6,8]

💬Q14: 数组复制与 copyWithin 用法

考察点:原数组修改、局部复制

js
let arr = [1, 2, 3, 4];
arr.copyWithin(0, 2, 4); // [3,4,3,4]

💬Q15: 数组常用方法是否会破坏原数组?

考察点:数组方法副作用

方法是否修改原数组
push, pop, shift, unshift, splice, sort, reverse, fill, copyWithin
map, filter, slice, concat, reduce, find, findIndex, includes, flat, flatMap