没有运行环境,都是手改;
“我的眼睛就是尺!”
1,实现定时器
<Countdown timeleft={} />
const Countdown = (timeleft) => {
const [time,setTime] = useState(timeleft)
useEffect(()=>{
const timer = setInterval(()=>{
setTime(prevTime=>{
if(prevTime<=1){
return 0
}else{
return prevTime - 1
}
})
},1000)
return ()=>clearInterval(timer)
},[time])
return(
<div>time:{time}</div>
)
}2, 说说react的生命周期 我就结合useEffect说了一下: return ()=>clearInterval(timer)这里是componentWillUnmounted
空deps是componentDidMount
deps有值的话,是componentDidUpdate
3, 在老版本中,为啥你代码里没用到react但是需要import?
因为进行jsx转换编译执行的时候会自动执行一个React.createElement
在React17+的版本中,JSX到JavaScript的转换发生在构建时,所以不再需要显示导入了;
4,React.createElement与虚拟dom的关系是? 创建虚拟dom
5,兄弟节点通信的方式?
就说了两个:
- 全局状态管理 redux,jotai和zustand
- context api, 用Provider同时给两个传值
有一说一,昨天面wxg,那边问问用这两个库的好处;没说出来;
6,比较这两个写法的区别
return Countdown({timeleft: xxx }) vs return <Countdown timeleft={} />7, fragment是做什么的? 它现在已经被优化成了<></>语法糖, 用处就是,便于添加多个子节点,同时不会造成别的渲染;
比如你用div来包裹的话,它还会应用上div的特性;
8, “简单”输出题
function changeStuff(a, b, c) {
a = a * 10;
b.item = "changed";
c = {item: "changed"};
}
var num = 10;
var obj1 = {item: "unchanged"};
var obj2 = {item: "unchanged"};
changeStuff(num, obj1, obj2);
console.log(num);
console.log(obj1.item);
console.log(obj2.item);9, 0.1加0.2,为什么不等于0点3?
位运算,0.1和0.2转成二进制都是无限小数,会被自动忽略尾数;因此会有误差;
10,如何解决精度问题?
答了在开发中,对精度的要求并没有这么高,在个别场景下,可以直接Math.floor()
11,如果涉及交易呢?
答:可以用一些涉及浮点数的第三方库;
12,写一个正则吧,写一个YYYYMMDD的正则
....
13, Promise如何处理异常
Promise.reject("xxx")直接回答了catch和try catch
然后写了这种
Promise.reject("error")
.catch(error => {
console.error(error);
});然后,他反问,“你不会async/await”? 我说我会;然后到了下一题;
后面复盘才发现,他应该是要我这样写:
async function handleError() {
try {
await Promise.reject("error");
} catch (error) {
console.error(error);
}
}14, 输出题
async function async1() {
console.log("async1 start");
await async2();
console.log("async1 end");
}
async function async2() {
console.log("async2");
}
console.log("script start");
async1();
console.log("script end");15, 手写一个reduce,细节还是很多的;
Array.prototype.reduce(callback,initValue){
// 初始值的细节
let acc = initValue !== undefined ? initValue : this[0]
let startIndex = initValue !== undefined ? 0 : 1
for(let i=startIndex;i<this.length;i++){
acc = callback(acc,this[i],i,this)
}
return acc
// 这里没有实现处理空值的情况 比如这种:[0,,01,2]
}