你能答全JS中数组全部的方法吗?

190 阅读8分钟

在前端面试中,如果面试官问你你知道数组身上有哪些方法吗,你肯定会心中一喜,嘿嘿,这个我熟,但是最后却发现自己怎么也答不全,其实不是你没有学会,而是你回答的方法有问题,数组的方法很多,你要学会分类答,这样才会有逻辑,从而做到一丝不漏。

image.png

我们首先来说增

🐟增

数组中的增也有很多种,我们分为两类,一类是会改变原数组,一类是不会改变原数组

会改变原数组

push()

push()方法将一个或多个元素添加到数组的末尾。它通过增加数组的长度来修改原始数组。

let myArray = [1, 2, 3];
myArray.push(4); 
console.log(myArray); // [1, 2, 3, 4]

myArray.push(5, 6);
console.log(myArray); // [1, 2, 3, 4, 5, 6]
unshift()

unshift()方法将一个或多个元素添加到数组的开头。与push()类似,它也会修改原始数组,但它影响的是数组的起始位置而不是末尾

let myArray = [2, 3, 4];
myArray.unshift(1);
console.log(myArray); // [1, 2, 3, 4]

myArray.unshift(-1, 0);
console.log(myArray); // [-1, 0, 1, 2, 3, 4]
splice()

splice()方法用于修改数组,他既可以增添原数组中的元素,也可以删除,这个我们后面会讲到,我们首先来讲到他的增添,他会改变原数组。

  • 语法array.splice(start[, deleteCount[, item1[, item2[,...]]]])

    • start:指定修改的开始位置(索引)。如果是负数,则从数组末尾开始计算,例如 -1 表示最后一个元素。
    • deleteCount(可选):要删除的元素数量。如果省略或其值大于从start开始到数组末尾的元素数量,则会删除从start开始到数组末尾的所有元素。如果值为 0,则不删除任何元素。
    • item1, item2,...(可选):要添加到数组中的元素,从start位置开始插入。
let array = [1, 2, 3];
array.splice(3, 0, 'new'); 
console.log(array); // [1, 2, 3, 'new']

不会改变原数组

concat()

concat()方法用于合并两个或多个数组,它不会改变原始数组,而是返回一个新的合并后的数组。

  • 语法var new_array = old_array.concat(array1[, array2[,...[, arrayN]]])
let array1 = [1, 2, 3];
let array2 = [4, 5];
let newArray = array1.concat(array2);
console.log(newArray); // [1, 2, 3, 4, 5]
console.log(array1); // [1, 2, 3] (原始数组未改变)

🐟删

我们还是分为两类,会改变原数组,不会改变原数组。

会改变原数组

pop()
  • pop()方法用于从数组中删除最后一个元素,并返回被删除的那个元素。此操作会直接修改原数组。
// 定义一个数组
let myArray = [10, 20, 30, 40];
// 使用pop()方法
let removedElement = myArray.pop();
console.log("被删除的元素:", removedElement); // 输出: 40
console.log("修改后的数组:", myArray); // 输出: [10, 20, 30]
shift()
  • shift()是 JavaScript 中的一个数组方法。它的主要功能是从数组的开头(索引为 0 的位置)删除一个元素,并返回被删除的元素。这个操作会直接修改原始数组,使数组的长度减 1。
let array = [1, 2, 3];
let removedElement = array.shift();
console.log(removedElement); // 1
console.log(array); // [2, 3]
splice()

splice()方法用于修改数组,这里是删除原数组身上的元素

  • 语法array.splice(start[, deleteCount[, item1[, item2[,...]]]])

    • start:指定修改的开始位置(索引)。如果是负数,则从数组末尾开始计算,例如 -1 表示最后一个元素。
    • deleteCount(可选):要删除的元素数量。如果省略或其值大于从start开始到数组末尾的元素数量,则会删除从start开始到数组末尾的所有元素。如果值为 0,则不删除任何元素。
    • item1, item2,...(可选):要添加到数组中的元素,从start位置开始插入。
let array = [1, 2, 3, 4, 5];
array.splice(2, 2); 
console.log(array); // [1, 2, 5]

不会改变原数组

slice()
  • 语法array.slice(start, end)

    • 参数

      • start(可选):提取起始位置的索引。如果是负数,则从数组末尾开始计算(例如 -2 表示从倒数第 2 个元素开始)。如果省略,则从 0 开始。
      • end(可选):提取终止位置的索引(不包括该索引对应的元素)。如果是负数,则从数组末尾开始计算。如果省略,则提取到数组末尾。
    • 功能:返回一个新的数组,包含从startend(不包括end)所选取的元素。这个方法不会改变原数组。

let array = [1, 2, 3, 4, 5];
// 从索引2开始提取到末尾
let newArray1 = array.slice(2); 
console.log(newArray1); // [3, 4, 5]
// 从索引1开始到索引3(不包括3)
let newArray2 = array.slice(1, 3); 
console.log(newArray2); // [2, 3]
// 从倒数第3个元素开始到末尾
let newArray3 = array.slice(-3); 
console.log(newArray3); // [3, 4, 5]

🐟查找

  1. includes()

    • 功能:用于判断一个数组或字符串是否包含指定的值,返回truefalse

    • 语法arr.includes(valueToFind[, fromIndex])fromIndex可选,表示开始查找的索引位置,默认为 0。

    • 示例

let array = [1, 2, 3, 4];
console.log(array.includes(3)); // true
console.log(array.includes(5)); // false
console.log(array.includes(2, 2)); // false,从索引2开始查找,找不到2

2. indexOf()

*   **功能**:返回在数组中可以找到给定元素的第一个索引,如果不存在,则返回 -1。

*   **语法**`arr.indexOf(searchElement[, fromIndex])``fromIndex`可选,从该索引处开始查找,默认为 0。

*   **示例**
let array = [1, 2, 3, 2];
console.log(array.indexOf(2)); // 1,第一次出现2的索引
console.log(array.indexOf(2, 2)); // 3,从索引2开始查找2的索引

3. lastIndexOf()

*   **功能**:返回指定元素在数组或字符串中最后一次出现的索引,如果不存在,则返回 -1。与`indexOf`相反,是从后往前找。

*   **语法**`arr.lastIndexOf(searchElement[, fromIndex])``fromIndex`可选,默认为数组长度 - 1,从该索引往前找。

*   **示例**
let array = [1, 2, 3, 2];
console.log(array.lastIndexOf(2)); // 3,最后一次出现2的索引

4. find()

*   **功能**:返回数组中满足提供的测试函数的第一个元素的值。如果没有找到,则返回`undefined`*   **语法**`arr.find(callback(element[, index[, array]])[, thisArg])``callback`是一个函数,用于测试每个元素,`thisArg`可选,用于绑定`callback`中的`this`*   **示例**
let array = [1, 2, 3, 4];
let result = array.find((element) => element > 2);
console.log(result); // 3

5. findLast()

*   **功能**:返回数组中满足提供的测试函数的最后一个元素的值。如果没有找到,则返回`undefined`。这是 ES2023 新特性。

*   **语法**`arr.findLast(callback(element[, index[, array]])[, thisArg])`*   **示例**
let array = [1, 2, 3, 4, 3];
let result = array.findLast((element) => element > 2);
console.log(result); // 4

6. findIndex()

*   **功能**:返回数组中满足提供的测试函数的第一个元素的索引。如果没有找到,则返回 -1。

*   **语法**`arr.findIndex(callback(element[, index[, array]])[, thisArg])`*   **示例**
let array = [1, 2, 3, 4];
let index = array.findIndex((element) => element > 2);
console.log(index); // 2

7. findLastIndex()

*   **功能**:返回数组中满足提供的测试函数的最后一个元素的索引。如果没有找到,则返回 -1。这是 ES2023 新特性。

*   **语法**`arr.findLastIndex(callback(element[, index[, array]])[, thisArg])`*   **示例**
let array = [1, 2, 3, 4, 3];
let index = array.findLastIndex((element) => element > 2);
console.log(index); // 4

8. some()

*   **功能**:测试数组中是否至少有一个元素通过了指定函数的测试,返回`true``false`*   **语法**`arr.some(callback(element[, index[, array]])[, thisArg])`*   **示例**
let array = [1, 2, 3, 4];
let hasEven = array.some((element) => element % 2 === 0);
console.log(hasEven); // true

9. every()

*   **功能**:测试数组中所有元素是否都通过了指定函数的测试,返回`true``false`*   **语法**`arr.every(callback(element[, index[, array]])[, thisArg])`*   **示例**
let array = [2, 4, 6];
let allEven = array.every((element) => element % 2 === 0);
console.log(allEven); // true

🐟转换

记住 toReversed()toSorted() 返回到新数组中,不改变原数组。 reverse()sorted() 是改变原数组

  1. reverse()

    • 功能:将数组中元素的位置颠倒,并返回该数组。原数组被修改。

    • 语法arr.reverse()

    • 示例

let array = [1, 2, 3];
let reversedArray = array.reverse();
console.log(reversedArray); // [3, 2, 1]
console.log(array); // [3, 2, 1],原数组改变

2. sort()

*   **功能**:对数组的元素进行排序,并返回排序后的数组。原数组被修改。默认排序顺序是根据字符串 Unicode 码点。

*   **语法**`arr.sort([compareFunction])``compareFunction`可选,用于定义排序规则。

*   **示例(默认排序)**
let array = [3, 1, 2];
let sortedArray = array.sort();
console.log(sortedArray); // [1, 2, 3]
console.log(array); // [1, 2, 3]
  • 示例(自定义排序)
let array = [3, 1, 2];
let sortedArray = array.sort((a, b) => a - b);
console.log(sortedArray); // [1, 2, 3]

3. toReversed()

*   **功能**:返回一个新的数组,其元素顺序与原数组相反。原数组不变,这是 ES2023 新特性。

*   **语法**`arr.toReversed()`*   **示例**
let array = [1, 2, 3];
let reversedArray = array.toReversed();
console.log(reversedArray); // [3, 2, 1]
console.log(array); // [1, 2, 3]

4. toString()

*   **功能**:将数组转换为字符串,并返回结果。数组的每个元素都会被转换为字符串,并用逗号分隔。

*   **语法**`arr.toString()`*   **示例**
let array = [1, 2, 3];
console.log(array.toString()); // "1,2,3"

5. join()

*   **功能**:将数组的所有元素连接成一个字符串。可以指定分隔符,默认为逗号。

*   **语法**`arr.join([separator])`*   **示例**
let array = [1, 2, 3];
console.log(array.join('-')); // "1-2-3"

6. toSorted()

*   **功能**:返回一个新的已排序数组,原数组不变,这是 ES2023 新特性。

*   **语法**`arr.toSorted([compareFunction])`*   **示例**
let array = [3, 1, 2];
let sortedArray = array.toSorted();
console.log(sortedArray); // [1, 2, 3]
console.log(array); // [3, 1, 2]

🐟迭代

  1. forEach()

    • 功能:对数组的每个元素执行一次给定的函数。它没有返回值,主要用于遍历数组并执行副作用操作。
    • 语法arr.forEach(callback(currentValue[, index[, array]])[, thisArg])
    • 示例
let array = [1, 2, 3];
array.forEach((element) => console.log(element)); 
// 1
// 2
// 3

2. map()

*   **功能**:创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。

*   **语法**`arr.map(callback(currentValue[, index[, array]])[, thisArg])`*   **示例**
let array = [1, 2, 3];
let newArray = array.map((element) => element * 2);
console.log(newArray); // [2, 4, 6]

3. filter()

*   **功能**:创建一个新数组,其元素是通过检查指定数组中符合条件的所有元素。

*   **语法**`arr.filter(callback(element[, index[, array]])[, thisArg])`*   **示例**
let array = [1, 2, 3, 4];
let evenArray = array.filter((element) => element % 2 === 0);
console.log(evenArray); // [2, 4]

🐟END

现在我们就可以分类来回答的,保证你的记忆效率翻倍!

  • 增:push,unshift,splice,concat
  • 删:pop ,shift,slice,splice
  • 查:includes,indexOf,LastIndexOf,find,findLast,findIndex,findLastIndex,some,every
  • 转换:reverse,sort,toReversed,toString,join,toSorted
  • 迭代:foreach,map,filter