面试官 : “ 请说一下 JS 的常见的数组 和 字符串方法有哪些 ? ”

297 阅读9分钟

盘点 JS 数组和字符串的核心方法,我会按「常用场景 + 功能分类」整理,每个方法标注作用 + 示例 + 关键说明,既好记又能直接用,适合复习和开发时快速查阅。

一、数组(Array)方法

数组方法是 JS 高频考点,按「增删改查、遍历、转换、排序 / 过滤 / 聚合」分类,重点标⭐️

1. 增删改查(修改原数组)

方法作用示例关键说明
⭐️ push()末尾添加元素[1,2].push(3) → [1,2,3]返回新长度,修改原数组
⭐️ pop()末尾删除元素[1,2,3].pop() → 3返回删除的元素,修改原数组
⭐️ unshift()头部添加元素[2,3].unshift(1) → [1,2,3]返回新长度,修改原数组
⭐️ shift()头部删除元素[1,2,3].shift() → 1返回删除的元素,修改原数组
⭐️ splice(start, delNum, ...add)任意位置增删改[1,2,3].splice(1,1,4) → [1,4,3]返回删除的元素,修改原数组
fill(val, start, end)填充数组[1,2,3].fill(0, 1, 2) → [1,0,3]修改原数组

2. 遍历(不修改原数组)

方法作用示例关键说明
⭐️ forEach()遍历数组,无返回值[1,2].forEach(item => console.log(item))无法中断(break 无效)
⭐️ map()遍历 + 返回新数组[1,2].map(item => item*2) → [2,4]不修改原数组,必用 return
⭐️ filter()过滤符合条件的元素[1,2,3].filter(item => item>1) → [2,3]返回新数组,保留满足条件的元素
⭐️ find()找第一个符合条件的元素[1,2,3].find(item => item>1) → 2找到即返回,无则 undefined
⭐️ findIndex()找第一个符合条件的索引[1,2,3].findIndex(item => item>1) → 1无则返回 -1
every()所有元素满足条件?[1,2,3].every(item => item>0) → true全满足返回 true
some()至少一个元素满足条件?[1,2,3].some(item => item>2) → true有一个满足就返回 true
reduce()聚合(求和 / 拼接等)[1,2,3].reduce((sum, item) => sum+item, 0) → 6第二个参数是初始值,核心是 “累积”

3. 转换 / 拼接(不修改原数组)

方法作用示例关键说明
⭐️ join(sep)数组转字符串[1,2].join('-') → "1-2"sep 是分隔符,默认逗号
⭐️ concat()拼接数组[1,2].concat([3,4]) → [1,2,3,4]返回新数组,不修改原数组
⭐️ slice(start, end)截取数组(左闭右开)[1,2,3].slice(0,2) → [1,2]不修改原数组,end 可选(默认到末尾)
flat(depth)扁平化数组[1,[2,[3]]].flat(2) → [1,2,3]depth 是层级,默认 1,Infinity 拍平所有
flatMap()map + flat(1)[1,2].flatMap(item => [item, item*2]) → [1,2,2,4]比先 map 再 flat 高效

4. 排序 / 查找(部分修改原数组)

方法作用示例关键说明
⭐️ sort(compare)排序[3,1,2].sort((a,b) => a-b) → [1,2,3]修改原数组,默认按字符串排序(需传比较函数)
⭐️ reverse()反转数组[1,2,3].reverse() → [3,2,1]修改原数组
⭐️ includes(val)判断是否包含元素[1,2].includes(2) → true区分类型(1 !== '1')
indexOf(val)找元素首次出现的索引[1,2,1].indexOf(1) → 0无则返回 -1
lastIndexOf(val)找元素最后出现的索引[1,2,1].lastIndexOf(1) → 2无则返回 -1

二、字符串(String)方法

字符串方法均不修改原字符串(字符串是不可变类型),按「查找 / 截取、替换 / 分割、转换、判断」分类。

1. 查找 / 截取

方法作用示例关键说明
⭐️ charAt(index)获取指定位置字符"abc".charAt(1) → "b"索引越界返回空字符串
⭐️ indexOf(str)找子串首次出现的索引"abcab".indexOf("ab") → 0无则返回 -1
⭐️ lastIndexOf(str)找子串最后出现的索引"abcab".lastIndexOf("ab") → 3无则返回 -1
⭐️ slice(start, end)截取字符串(左闭右开)"abcde".slice(1,3) → "bc"start 负数表示从末尾数
substring(start, end)截取字符串"abcde".substring(1,3) → "bc"类似 slice,但 start>end 会自动交换
substr(start, length)按长度截取"abcde".substr(1,2) → "bc"已废弃,优先用 slice
⭐️ includes(str)判断是否包含子串"abc".includes("b") → true区分大小写
startsWith(str)判断是否以子串开头"abc".startsWith("ab") → true可传第二个参数(起始位置)
endsWith(str)判断是否以子串结尾"abc".endsWith("bc") → true可传第二个参数(截取长度)

2. 替换 / 分割

方法作用示例关键说明
⭐️ replace(str/regex, newStr)替换子串"abc".replace("b", "x") → "axc"只替换第一个,全局替换用 /g 正则
⭐️ split(sep)字符串转数组"a-b-c".split("-") → ["a","b","c"]sep 为空字符串则拆成单个字符
replaceAll(str/regex, newStr)全局替换"abab".replaceAll("a", "x") → "xbxb"ES2021 新增,无需 /g 正则

3. 转换 / 格式化

方法作用示例关键说明
⭐️ toLowerCase()转小写"ABC".toLowerCase() → "abc"不修改原字符串
⭐️ toUpperCase()转大写"abc".toUpperCase() → "ABC"不修改原字符串
⭐️ trim()去除首尾空格" abc ".trim() → "abc"不处理中间空格
trimStart()/trimLeft()去除开头空格" abc".trimStart() → "abc"别名,作用一致
trimEnd()/trimRight()去除结尾空格"abc ".trimEnd() → "abc"别名,作用一致
repeat(n)重复字符串"ab".repeat(2) → "abab"n 为 0 返空,负数报错
padStart(len, str)头部补全"123".padStart(5, "0") → "00123"常用于补零
padEnd(len, str)尾部补全"123".padEnd(5, "0") → "12300"超出长度则截断

三、数组 & 字符串互通方法

场景实现方式示例
数组 → 字符串arr.join(sep)[1,2].join("") → "12"
字符串 → 数组str.split(sep)"abc".split("") → ["a","b","c"]
遍历字符串转数组后用数组遍历方法"abc".split("").forEach(char => console.log(char))

总结

  1. 数组核心:修改原数组的方法(push/pop/splice/sort)要注意副作用,遍历优先用 map/filter/reduce(返回新数组),列表查找用 find/findIndex 更高效;

  2. 字符串核心:所有方法不修改原字符串,截取用 slice、替换用 replace/replaceAll、分割用 split,判断包含用 includes;

  3. 高频互通:数组转字符串用 join,字符串转数组用 split,是开发中最常用的联动操作。

数组方法详细代码示例

push()

末尾添加元素

let arr = [1,2]
arr.push(3)
console.log(arr) // [1,2,3]

pop()

删除末尾元素

let arr = [1,2,3]
arr.pop()
console.log(arr) // [1,2]

unshift()

开头添加元素

let arr = [2,3]
arr.unshift(1)
console.log(arr) // [1,2,3]

shift()

删除开头元素

let arr = [1,2,3]
arr.shift()
console.log(arr) // [2,3]

concat()

合并数组

let a = [1,2]
let b = [3,4]
console.log(a.concat(b)) // [1,2,3,4]

slice()

截取数组(开始,结束)

let arr = [1,2,3,4]
console.log(arr.slice(1,3)) // [2,3]

splice()

删除/插入/替换元素

  • 删除splice(起始索引, 删除个数)

  • 添加splice(插入位置, 0, 新元素)

  • 替换splice(位置, 1, 新元素)

  • 会修改原数组,返回被删除的元素数组

// 统一使用的原始数组
let arr;

// ============== 1. 删除元素 ==============
arr = ['苹果', '香蕉', '橙子', '葡萄', '芒果'];
let deleted1 = arr.splice(1, 2);
console.log('1. 删除元素:', arr); // 1. 删除元素: ['苹果', '葡萄', '芒果']
console.log('被删除:', deleted1); // 被删除: ['香蕉', '橙子']

// ============== 2. 添加元素 ==============
arr = ['苹果', '香蕉', '橙子', '葡萄', '芒果'];
arr.splice(2, 0, '榴莲', '西瓜');
console.log('2. 添加元素:', arr); // 2. 添加元素: ['苹果', '香蕉', '榴莲', '西瓜', '橙子', '葡萄', '芒果']

// ============== 3. 替换元素 ==============
arr = ['苹果', '香蕉', '橙子', '葡萄', '芒果'];
arr.splice(3, 1, '草莓');
console.log('3. 替换元素:', arr); // 3. 替换元素: ['苹果', '香蕉', '橙子', '草莓', '芒果']

// ============== 4. 负数索引删除末尾 ==============
arr = ['苹果', '香蕉', '橙子', '葡萄', '芒果'];
arr.splice(-1, 1);
console.log('4. 删除最后一个:', arr); // 4. 删除最后一个: ['苹果', '香蕉', '橙子', '葡萄']

// ============== 5. 删除从索引到末尾所有元素 ==============
arr = ['苹果', '香蕉', '橙子', '葡萄', '芒果'];
arr.splice(2);
console.log('5. 删除索引2及之后:', arr); // 5. 删除索引2及之后: ['苹果', '香蕉']

indexOf()

查找元素第一次出现的位置

let arr = [1,2,3,2]
console.log(arr.indexOf(2)) // 1

lastIndexOf()

查找元素最后一次出现的位置

let arr = [1,2,3,2]
console.log(arr.lastIndexOf(2)) // 3

includes()

判断是否包含元素

let arr = [1,2,3]
console.log(arr.includes(2)) // true

join()

数组转字符串

let arr = [1,2,3]
console.log(arr.join('-')) // 1-2-3

reverse()

反转数组

let arr = [1,2,3]
arr.reverse()
console.log(arr) // [3,2,1]

sort()

数组排序

let arr = [3,1,2]
arr.sort((a,b)=>a-b)
console.log(arr) // [1,2,3]

forEach()

遍历数组

let arr = [1,2,3]
arr.forEach(item=>console.log(item))

map()

映射新数组

let arr = [1,2,3]
let newArr = arr.map(item=>item*2)
console.log(newArr) // [2,4,6]

filter()

过滤数组

let arr = [1,2,3,4]
let newArr = arr.filter(item=>item>2)
console.log(newArr) // [3,4]

find()

查找第一个符合条件的元素

let arr = [1,2,3]
let res = arr.find(item=>item>1)
console.log(res) // 2

findIndex()

查找第一个符合条件的索引

let arr = [1,2,3]
let res = arr.findIndex(item=>item>1)
console.log(res) // 1

every()

判断所有元素是否满足条件

let arr = [2,4,6]
console.log(arr.every(item=>item%2===0)) // true

some()

判断是否有元素满足条件

let arr = [1,2,3]
console.log(arr.some(item=>item>2)) // true

reduce()

累计计算

let arr = [1,2,3]
let sum = arr.reduce((a,b)=>a+b,0)
console.log(sum) // 6

reduceRight()

从右往左累计

let arr = [1,2,3]
let res = arr.reduceRight((a,b)=>a-b)
console.log(res) // 0

fill()

填充数组

let arr = new Array(3).fill(0)
console.log(arr) // [0,0,0]

flat()

扁平化数组

let arr = [1,[2,[3]]]
console.log(arr.flat(2)) // [1,2,3]

flatMap()

先map再flat

let arr = [1,2]
let res = arr.flatMap(item=>[item,item*2])
console.log(res) // [1,2,2,4]

keys()

返回索引迭代器

let arr = ['a','b']
for(let k of arr.keys()){
  console.log(k) // 0 1
}

values()

返回值迭代器

let arr = ['a','b']
for(let v of arr.values()){
  console.log(v) // a b
}

entries()

返回键值对迭代器

let arr = ['a','b']
for(let [i,v] of arr.entries()){
  console.log(i,v) // 0 'a'  1 'b'
}

字符串方法详细代码示例

charAt()

获取指定位置的字符

let str = 'hello'
console.log(str.charAt(1)) // e

charCodeAt()

获取指定位置字符的 Unicode 编码

let str = 'hello'
console.log(str.charCodeAt(0)) // 104

concat()

拼接字符串

let a = 'hello'
let b = ' world'
console.log(a.concat(b)) // hello world

includes()

判断是否包含指定字符串

let str = 'hello vue'
console.log(str.includes('vue')) // true

indexOf()

查找字符第一次出现的位置,找不到返回 -1

let str = 'hello'
console.log(str.indexOf('l')) // 2

lastIndexOf()

查找字符最后一次出现的位置

let str = 'hello'
console.log(str.lastIndexOf('l')) // 3

startsWith()

判断是否以指定字符串开头

let str = 'hello world'
console.log(str.startsWith('hello')) // true

endsWith()

判断是否以指定字符串结尾

let str = 'hello world'
console.log(str.endsWith('world')) // true

slice()

截取字符串(开始,结束)

let str = 'hello'
console.log(str.slice(1,3)) // el

substring()

截取字符串(开始,结束)不支持负数

let str = 'hello'
console.log(str.substring(1,3)) // el

substr()

截取字符串(开始,长度)已弃用

let str = 'hello'
console.log(str.substr(1,2)) // el

split()

字符串转数组

let str = 'a,b,c'
console.log(str.split(',')) // ['a','b','c']

toUpperCase()

转大写

let str = 'hello'
console.log(str.toUpperCase()) // HELLO

toLowerCase()

转小写

let str = 'HELLO'
console.log(str.toLowerCase()) // hello

trim()

去除两端空格

let str = '  hello  '
console.log(str.trim()) // hello

trimStart()

去除开头空格

let str = '  hello'
console.log(str.trimStart()) // hello

trimEnd()

去除结尾空格

let str = 'hello  '
console.log(str.trimEnd()) // hello

padStart()

开头补全字符串

let str = '5'
console.log(str.padStart(2, '0')) // 05

padEnd()

结尾补全字符串

let str = '5'
console.log(str.padEnd(2, '0')) // 50

repeat()

重复字符串

let str = 'hi'
console.log(str.repeat(3)) // hihihi

replace()

替换第一个匹配项

let str = 'hello hello'
console.log(str.replace('hello', 'hi')) // hi hello

replaceAll()

替换所有匹配项

let str = 'hello hello'
console.log(str.replaceAll('hello', 'hi')) // hi hi

search()

正则查找,返回位置

let str = 'hello123'
console.log(str.search(/\d/)) // 5

match()

正则匹配,返回数组

let str = 'abc123def'
console.log(str.match(/\d+/)) // ['123']

matchAll()

正则全局匹配

let str = 'a1b2c3'
let arr = [...str.matchAll(/\d/g)]
console.log(arr) // [['1'],['2'],['3']]