1.为什么选择前端
2.介绍一个自己的项目
3.如何进行的技术选型?
4.怎样学习新技术的
5.如果现在重新做这个项目,你会怎么样
6.具体一点,在部署方面,会有什么改进?
7.let,var和const之间的区别
[[前端面试常见题-JS篇]]
8.有哪些常用的数组方法
以下是一些常用的数组方法,按照是否改变原数组分为两类
1. 改变原数组 (Mutating Methods)
这些方法会直接修改调用它们的数组本身。
方法 | 描述 | 返回值 |
---|---|---|
push() | 在数组末尾添加一个或多个元素。 | 新数组的长度 |
pop() | 删除并返回数组的最后一个元素。 | 被删除的元素 |
shift() | 删除并返回数组的第一个元素。 | 被删除的元素 |
unshift() | 在数组开头添加一个或多个元素。 | 新数组的长度 |
splice() | 万能方法:可以从指定位置删除、插入或替换元素。 | 包含被删除元素的数组 |
sort() | 对数组元素进行排序。注意: 默认按字符串的 Unicode 码位排序! | 排序后的数组(原数组的引用) |
reverse() | 反转数组中元素的顺序。 | 反转后的数组(原数组的引用) |
fill() | 用一个固定值填充数组中从起始索引到终止索引内的全部元素。 | 修改后的数组(原数组的引用) |
2. 不改变原数组 (Non-mutating Methods)
这些方法会返回一个新的数组或一个新的值,而不会修改原始数组。这是现代 JavaScript (特别是函数式编程和 React 等框架) 中更推荐的方式。
A. 创建新数组
方法 | 描述 | 返回值 |
---|---|---|
map() | 映射:遍历数组,对每个元素执行一个函数,并将结果组成一个新数组返回。 | 一个新的、经过转换的数组 |
filter() | 过滤:返回一个新数组,其中包含所有通过所提供函数测试的元素。 | 一个新的、经过过滤的数组 |
slice() | 切片:返回一个从 start 到 end (不包括 end )选择的数组部分的浅拷贝。 | 一个新的、包含切片元素的数组 |
concat() | 连接:用于合并两个或多个数组。 | 一个新的、合并后的数组 |
flat() | 扁平化:创建一个新数组,并将所有子数组元素递归地连接到指定深度。 | 一个新的、扁平化的数组 |
flatMap() | 先对每个元素执行 map 操作,然后对结果执行 flat 操作(深度为1)。 | 一个新的、扁平化的数组 |
B. 查找元素/信息
方法 | 描述 | 返回值 |
---|---|---|
find() | 返回数组中满足测试函数的第一个元素的值。否则返回 undefined 。 | 找到的元素值或 undefined |
findIndex() | 返回数组中满足测试函数的第一个元素的索引。否则返回 -1 。 | 找到的元素索引或 -1 |
includes() | 判断一个数组是否包含一个指定的值,返回 true 或 false 。 | true 或 false |
indexOf() | 返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回 -1 。 | 索引值或 -1 |
C. 迭代与归并
方法 | 描述 | 返回值 |
---|---|---|
forEach() | 遍历:对数组的每个元素执行一次给定的函数。 | undefined |
reduce() | 归并:对数组中的每个元素执行一个 “reducer” 函数(升序执行),将其结果汇总为单个返回值。 | 函数累计处理的结果 |
every() | 测试所有:测试一个数组内的所有元素是否都能通过某个指定函数的测试。 | true 或 false |
some() | 测试部分:测试数组中是不是至少有1个元素通过了被提供的函数测试。 | true 或 false |
join() | 连接成字符串:将一个数组的所有元素连接成一个字符串并返回这个字符串。 | 一个包含所有数组元素的字符串 |
9.forEach和map的区别
特性 | forEach() | map() |
---|---|---|
主要目的 | 执行副作用 (Side Effects)。比如打印到控制台、修改外部变量、操作 DOM 等。 | 数据转换 (Transformation)。从一个数组派生出另一个具有不同数据或结构的数组。 |
返回值 | undefined | 一个新的数组,长度与原数组相同。 |
链式调用 | 不可以。因为它返回 undefined ,你不能在其后链接其他数组方法。 | 可以。因为它返回一个新数组,你可以继续链接 .filter() , .reduce() 等方法。 |
10.some的用法
见上
11.promise是为了解决什么问题,如何解决的,再介绍一下 async, await
12.promise和async语法在错误处理上有什么区别
Promise可以使用 .catch()
,async一般用 try ... catch
对于Promise来说,链条上任何一个promise变为 rejected状态,会跳过后续所有 .then()
,直到找到第一个 .catch()
而try catch可以捕获所有try代码块中的错误
深入讨论一下,如果需要再请求失败之后再继续执行,对于try catch,可以直接在catch块下方添加代码就行,但是对于 .catch()
,就需要在其内部返回一个普通值,再继续 .then()
此外,try catch块可以无缝捕获同步错误
13.promise是怎样实现链式调用的,如果传入的是一个字符串呢?传入字符串和传入Promise(“字符串“)有什么区别
如果传入一个字符串,直接返回一个fulfilled状态的promise,返回值是这个字符串的值,这是 同步的
如果是返回的一个 new Promise(resolve => resolve("字符串")
,就是 异步 的行为。
14.ts有哪些常用的工具类
[[前端面试常见题-JS篇]]
15.git中分支你是怎么理解的
多人协作,互不影响
16.合并过程中的冲突是怎么解决的
17.了解哪些http状态码
[[前端面试常见题-网络和工程化篇]]
18.get 和 post有什么区别
[[前端面试常见题-网络和工程化篇]]
19.手撕:实现一个历史浏览记录功能,visit方法访问新页面,清除当前页面之后的所有历史数据,back方法,往后退n个页面,forward方法往前进n个页面