这是一个非常基础但重要的 JavaScript 面试题,考察对数组操作的掌握程度。JavaScript 提供了丰富的数组方法,可以分为 增删改查、遍历、转换、排序、查找、合并 等几大类。
✅ 一、添加元素(增)
方法 | 作用 | 是否改变原数组 |
---|
push(...items) | 在数组末尾添加一个或多个元素,返回新长度 | ✅ 改变 |
unshift(...items) | 在数组开头添加一个或多个元素,返回新长度 | ✅ 改变 |
concat(...arrays) | 合并数组,返回新数组 | ❌ 不改变 |
const arr = [1, 2];
arr.push(3); // [1, 2, 3]
arr.unshift(0); // [0, 1, 2, 3]
arr.concat([4, 5]); // [0, 1, 2, 3, 4, 5](原数组不变)
✅ 二、删除元素(删)
方法 | 作用 | 是否改变原数组 |
---|
pop() | 删除并返回最后一个元素 | ✅ 改变 |
shift() | 删除并返回第一个元素 | ✅ 改变 |
splice(start, deleteCount, ...items) | 从指定位置删除(或替换)元素 | ✅ 改变 |
slice(start, end) | 截取子数组,返回新数组 | ❌ 不改变 |
filter(callback) | 过滤元素,返回满足条件的新数组 | ❌ 不改变 |
const arr = [1, 2, 3, 4];
arr.pop(); // 4,arr 变为 [1,2,3]
arr.shift(); // 1,arr 变为 [2,3]
arr.splice(1, 1); // 删除索引1的元素,返回 [2,4]
arr.slice(0, 2); // [2,3](不改变原数组)
arr.filter(x => x > 2); // [3,4]
✅ 三、修改/替换元素(改)
方法 | 作用 | 是否改变原数组 |
---|
splice(start, deleteCount, ...items) | 在指定位置插入或替换元素 | ✅ 改变 |
fill(value, start, end) | 用指定值填充数组 | ✅ 改变 |
copyWithin(target, start, end) | 在数组内部复制一段到另一位置 | ✅ 改变 |
const arr = [1, 2, 3];
arr.splice(1, 1, 'a'); // [1, 'a', 3]
arr.fill(0, 1, 3); // [1, 0, 0]
✅ 四、查找元素(查)
方法 | 返回值 | 是否改变原数组 |
---|
indexOf(item, fromIndex) | 第一个匹配元素的索引,无则 -1 | ❌ |
lastIndexOf(item) | 最后一个匹配元素的索引 | ❌ |
includes(item) | 是否包含该元素(布尔值) | ❌ |
find(callback) | 返回第一个满足条件的元素 | ❌ |
findIndex(callback) | 返回第一个满足条件的元素索引 | ❌ |
some(callback) | 是否至少有一个元素满足条件 | ❌ |
every(callback) | 是否所有元素都满足条件 | ❌ |
const arr = [10, 20, 30];
arr.indexOf(20); // 1
arr.includes(25); // false
arr.find(x => x > 15); // 20
arr.findIndex(x => x > 25); // 2
arr.some(x => x > 25); // true
arr.every(x => x > 5); // true
✅ 五、遍历与转换
方法 | 作用 | 是否改变原数组 |
---|
forEach(callback) | 遍历数组,无返回值 | ❌ |
map(callback) | 映射新数组,返回新数组 | ❌ |
reduce(callback, init) | 累计计算,返回最终值 | ❌ |
reduceRight() | 从右往左累计 | ❌ |
[1, 2, 3].forEach(x => console.log(x));
[1, 2, 3].map(x => x * 2); // [2, 4, 6]
[1, 2, 3].reduce((sum, x) => sum + x, 0); // 6
✅ 六、排序与反转
方法 | 作用 | 是否改变原数组 |
---|
sort(compareFn) | 排序(默认字符串排序) | ✅ 改变 |
reverse() | 反转数组 | ✅ 改变 |
[3, 1, 2].sort(); // [1, 2, 3]
[1, 2, 3].reverse(); // [3, 2, 1]
✅ 七、合并与连接
方法 | 作用 | 是否改变原数组 |
---|
concat(...arrays) | 合并数组 | ❌ |
join(separator) | 将数组转为字符串 | ❌ |
toString() | 转为字符串 | ❌ |
[1, 2].concat([3, 4]); // [1,2,3,4]
[1, 2, 3].join('-'); // "1-2-3"
✅ 八、其他实用方法
方法 | 说明 |
---|
Array.from(iterable) | 从类数组或可迭代对象创建新数组 |
Array.of(...items) | 创建数组(比 new Array() 更安全) |
flat(depth) | 扁平化嵌套数组 |
flatMap(callback) | map + flat |
Array.from('hi'); // ['h', 'i']
[1, [2, 3]].flat(); // [1, 2, 3]
[1, 2].flatMap(x => [x, x * 2]); // [1,2, 2,4]
✅ 总结(面试回答模板)
JavaScript 操作数组的方法非常丰富,主要分为:
- 增:
push
、unshift
、concat
、splice
- 删:
pop
、shift
、splice
、slice
、filter
- 改:
splice
、fill
- 查:
indexOf
、includes
、find
、findIndex
- 遍历:
forEach
、map
、reduce
- 排序:
sort
、reverse
- 合并:
concat
、join
大部分方法如 map
、filter
、slice
是纯函数,不改变原数组;而 push
、pop
、splice
、sort
等会修改原数组,使用时需注意。
掌握这些方法及其是否改变原数组,是写出健壮代码的关键。