如何理解这样的一道题?(不要测试,留下你的分析过程与结果)

如题详述: 刚面试完,就来写下了这样一道题目,还没有测试,也希望你不要测试,留下您的分析过程与答案


1、一切都是由我写的一道使用reduce方法求和数组引起的:


var arr = [1,2,3];

arr.reduce((sum,value) => {

    return sum + value

},0)

2、但是被面试官在上面加了点东西,就有点懵逼了:


var arr = [1,2,3];

arr.reduce((sum,value) => {

    setTimeout(() => console.log(1), 0)

    return sum + value

},0)

我说,先输出求和结果,再输出1(个人理解不知道对错,他也没说多少。)


3、接着,他又在上面修改了,想了下还是保留我的答案


var arr = [1,2,3];

arr.reduce((sum,value) => {

    setTimeout(() => console.log(1), 1000)

    return sum + value

},0)

请问你们是怎样分析与理解的....


浮云间
浏览 530回答 6
6回答

呼如林

第一个是6,没什么说的。第二个是先6,立刻后3个1。第三个是先6,一秒后3个1。面试官是想考js的eventloop,简单的说就是事件的优先级。具体叫哪个名词记不清楚了,setTimeout的优先级没有顺序执行的代码优先级高。拿第二个来说,reduce第一次的时候,遇到了settimeout,把settimeout放到次优先级的队列里,然后第二次,第三次。当reduce都执行完毕,开始执行次优先级队列的任务。第三个就更清楚了,执行次优先级队列之前先等一秒。

有只小跳蛙

个人理解:arr.reduce 传第二个参数,所以会执行arr.length 次, 也就是会执行 arr.length次setTimeout, 此题如下:const eventLoop = [];const arr = [1,2,3]arr.reduce((sum, value) => {    eventLoop.push(() => console.log(1));    return sum + value;});eventLoop.forEach(fn => fn())不管时间多少,一直在reduce的线程中,所以都是输出求和结果,在执行setTimeout的回调可能不对,哈哈哈

千巷猫影

其实大概是考你执行顺序吧!不过已经有大佬进行发言了,具体我就不太清楚了。如果没有看到大佬说的优先级,我会依据个人经验推论,既然他显示结果,那么必然是返回后再执行的,但如果它设了 setTimeout 事件,那么第二个,没有延迟,会直接进行执行。而第三个因为有延迟,会出现执行完后,在第一次运行的延迟时间到了连续出现一的结果。验证后,大佬说的优先级是没错的。

PIPIONE

这需要分析啥?很简单吧?你会就是setTimeout执行三次,因此稍后会输出三个1还是setTimeout执行三次,因此稍后会输出三个1, 但是时间在1000ms之后

慕田峪4524236

第一个输出6第二个是先输出6,然后输出1,1,1第三个是先输出6,一秒后,再输出1,1,1这‘三个1’是有顺序的,哪怕时间间隔很小(可能1ms都不到),但还是有顺序的

收到一只叮咚

这是关于时间循环的考察,你的代码会在执行栈中执行,setTimeout会被放入任务队列中。执行的时候是要先运行执行栈中的代码,再将任务队列中的代码放到执行栈中执行。所以setTimeout会在之后输出。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript