2026晓多科技一面---转正实习
1. 自我介绍
2. 项目中遇到的难点和解决办法
3. react 中的 useEffect经典闭包场景
import { useState, useEffect } from 'react';
function Counter() {
const [count, setCount] = useState(0);
// 点击按钮触发的函数
const handleClick = () => {
setCount(1); // 先把count设为1
// 3秒后尝试修改count
setTimeout(() => {
console.log('定时器里的count值:', count); // 关键:输出的是多少?
setCount(count + 1); // 期望count变成2,实际会变成多少?
}, 3000);
};
return (
<div>
<p>当前计数:{count}</p>
<button onClick={handleClick}>点击修改计数</button>
</div>
);
}
export default Counter;问 counter点击之后有什么变化
4. 同步代码、微任务、宏任务的执行顺序
async function async1() {
console.log('async1 start')
await async2()
console.log('async1 end')
}
async function async2() {
console.log('async2')
}
console.log('script start')
setTimeout(() => {
console.log('setTimeout')
}, 0)
async1()
new Promise(resolve => {
console.log('Promise1')
resolve()
}).then(() => {
console.log('Promise2')
})
console.log('script end')回头看很简单,之前没做过这类题目,没做出来!
5. 项目中遇到性能优化问题没,是什么解决的,有什么常用方法?
6. react中的 usecallback、memo、useMemo
7. 为什么项目中使用 fetch sse流而不是 EventSource?
8. 在sse流的流式输出时候,你是如何解决输出抖动问题的?
9. ai-chat项目中有没有用到虚拟列表,它和普通列表相比,难点在哪?
10. 如何实现在流式中,视口自动下拉?
11. 如果在流式中,视口自动下拉,但是用户想上拉视口怎么解决?。此问题有完全总结答案https://lingwang.ink/posts/project/scrollup
12. 讲一下原型链和作用域链 (作用域链没说出来!)
13. 讲一下闭包
14. 手撕算法 lodash库中的flattenObject方法 (没解出来)
输入:
const obj = {
a: {
b: {
c: {
d: "value"
},
e: "e-value"
},
f: "f-value"
},
g: "g-value"
};
要求输出:
{
"a.b.c.d": "value",
"a.b.e": "e-value",
"a.f": "f-value",
"g": "g-value"
}
/**
* 扁平化嵌套对象,将嵌套路径转换为点连接的键
* @param {Object} target - 要扁平化的目标对象
* @param {string} [prefix=''] - 递归时的路径前缀
* @param {Object} [result={}] - 存储结果的对象
* @returns {Object} 扁平化后的对象
*/
function flattenObject(target, prefix = '', result = {}) {
// 遍历对象的每个键
for (const key in target) {
// 确保是对象自身的属性(排除原型链属性)
if (target.hasOwnProperty(key)) {
// 拼接当前路径:前缀 + 点(如果有前缀) + 当前键
const currentKey = prefix ? `${prefix}.${key}` : key;
const value = target[key];
// 判断当前值是否是对象且不是 null(null 的 typeof 也是 object)
if (typeof value === 'object' && value !== null) {
// 递归处理嵌套对象
flattenObject(value, currentKey, result);
} else {
// 非对象类型,直接存入结果
result[currentKey] = value;
}
}
}
return result;
}
// 执行扁平化并打印结果
const flattenedObj = flattenObject(obj);
console.log(JSON.stringify(flattenedObj, null, 2));15. 因为 算法没做出来,面试官换了个简单的防抖hook,因为太紧张,防抖写错了,严重拉低预期
总结
本次面试一共持续 1 小时 3 分钟,面试官给出建议:“项目经验比较丰富,但是基础薄弱”,预期挂。自我评估:最近忙于项目和ai-coding,代码写的变少了,导致算法题和简单的utils工具方法都无从下手,头重脚轻。