数组方法有哪些?
一、数组基础概念
- 定义: JavaScript 中的一种对象,用于存储有序数据集合。
- 特点:
- 元素有序,可通过索引访问。
- 支持不同类型混合存储。
- 长度可动态变化。
- 判断数组:
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]] | ❌ |
flatMap | map + 扁平化 | [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: 数组的浅拷贝和深拷贝有哪些方法?
考察点:数组引用类型拷贝原理 答案/解析:
浅拷贝:只复制第一层,内部对象引用不变
jslet arr = [1, 2, [3, 4]]; let shallow = [...arr]; shallow[2][0] = 100; console.log(arr); // [1,2,[100,4]]
深拷贝:复制所有层,独立
jslet 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 | ❌ |