面试官最爱坑人的5道编程题,答不对直接挂

张开发
2026/4/10 1:28:35 15 分钟阅读

分享文章

面试官最爱坑人的5道编程题,答不对直接挂
文章目录前言第一题那个让人抓狂的this第二题Python的共享饭盒第三题闭包里的定时炸弹第四题0.1加0.2为什么不等于0.3第五题异步世界的插队游戏写在最后无意间发现了一个巨牛巨牛巨牛的人工智能教程非常通俗易懂对AI感兴趣的朋友强烈推荐去看看传送门https://blog.csdn.net/HHX_01前言今天咱们聊点实在的——面试。都说面试是技术人的第二战场代码写得再好面试时栽在那些看似简单实则暗藏杀机的题上那也是白搭。我在AI这行摸爬滚打这么多年见过太多技术大牛因为轻敌被面试官几道送分题直接送走。别慌今天我就给大家扒一扒2025年面试官最爱挖坑的5道编程题。这些题看着人畜无害实际个个都能让候选人当场社死。看完这篇文章下次面试遇到你就能会心一笑就这第一题那个让人抓狂的this来先看段代码你猜输出啥constobj{name:AI大神,sayHi:function(){setTimeout(function(){console.log(Hello, this.name);},100);}};obj.sayHi();很多兄弟一看这不明摆着输出Hello, AI大神吗obj调用的sayHithis肯定指向obj啊坑在哪面试官就等着你这句话呢。实际上这段代码输出的是Hello, undefined严格模式下或者Hello,非严格模式。因为setTimeout里的回调函数是普通函数在浏览器环境下它里面的this默认指向window而window.name是个空字符串或者未定义。这就好比你去KTV唱歌明明是你点的歌结果话筒被隔壁桌的大哥抢过去唱了。setTimeout就是那个大哥它把this的指向给抢走了。怎么破用箭头函数啊朋友们setTimeout((){console.log(Hello, this.name);},100);箭头函数没有自己的this它会继承外层的this就像你跟在大哥后面话筒最后还是回到你手里。第二题Python的共享饭盒来看这道Python题这也是面试官常玩的套路defadd_item(item,items[]):items.append(item)returnitemsprint(add_item(1))print(add_item(2))print(add_item(3))你可能想这不就是往列表里加东西吗第一次[1]第二次[2]第三次[3]多简单。坑在哪Python的默认参数在函数定义时就被计算了而且只计算一次。也就是说那个items[]是在你写代码的时候就创建了每次调用都是往同一个列表里加东西。实际输出是[1] [1, 2] [1, 2, 3]这就像你带了个饭盒去公司第一天放了鸡腿第二天放了青菜第三天放了米饭。结果你打开饭盒一看里面啥都有——因为这几天你用的是同一个饭盒怎么破把默认参数设为Nonedefadd_item(item,itemsNone):ifitemsisNone:items[]items.append(item)returnitems这样每次调用都会新建一个列表各自吃各自的互不干扰。第三题闭包里的定时炸弹这道题在JavaScript面试中出现的频率高得吓人for(vari0;i5;i){setTimeout(function(){console.log(i);},100);}很多人信誓旦旦地说输出0,1,2,3,4嘛循环五次每次打印当前的i。坑在哪var声明的变量是函数作用域不是块级作用域。等setTimeout的回调执行时循环早就跑完了i已经变成了5。而且由于五个回调共享同一个i最后打印的全是5。输出结果是5,5,5,5,5。这就像你约了五个朋友明天中午12点吃饭但你跟他们说的是明天吃我明天想吃的。结果到了明天你只想吃火锅五个人全被拉去吃火锅了——他们拿到的都是你最后的状态而不是约定时的状态。怎么破用let代替varfor(leti0;i5;i){setTimeout(function(){console.log(i);},100);}let有块级作用域每次循环都会创建一个新的i就像你跟每个朋友单独约定每个人都记住了当时的快照。或者用闭包把当时的值锁住for(vari0;i5;i){(function(j){setTimeout(function(){console.log(j);},100);})(i);}第四题0.1加0.2为什么不等于0.3这道题堪称面试界的脑筋急转弯console.log(0.10.20.3);你肯定会说这不是true吗小学数学白学了坑在哪计算机存储小数是用二进制浮点数而0.1和0.2转换成二进制是无限循环小数就像1/3在十进制里是0.333...一样。计算机存不下无限位只能截断这就产生了精度误差。实际上0.1 0.2等于0.30000000000000004当然不等于0.3。这就像你去买东西标价0.1元和0.2元你给了0.3元收银员却说你给少了——因为在他眼里你给的其实是0.30000000000000004元他还得找你零虽然这个零头小得离谱。怎么破别用直接比较浮点数而是看差值是否足够小Math.abs(0.10.2-0.3)1e-10;或者先把小数转成整数计算算完再转回来(0.1*100.2*10)/100.3;// true第五题异步世界的插队游戏最后一道题也是最能看出候选人JS功底的题console.log(1);setTimeout(function(){console.log(2);},0);Promise.resolve().then(function(){console.log(3);});console.log(4);你猜输出顺序是啥1,2,3,4还是1,4,2,3坑在哪这里考察的是事件循环Event Loop和任务队列的知识。setTimeout是宏任务MacroTaskPromise.then是微任务MicroTask。JS执行顺序是同步代码 → 微任务 → 宏任务。所以setTimeout虽然延迟是0但它被扔进了宏任务队列要等当前同步代码执行完、微任务也执行完才轮得到它。输出结果是1,4,3,2。这就像你在银行排队同步代码是VIP客户直接办理Promise是快速通道里的客户VIP办完后他们先上setTimeout虽然来得早但拿的是普通号只能老老实实等着。怎么破记住这个口诀同步优先微任务插队宏任务靠后。2025年了Node.js和浏览器的事件循环机制虽然有细微差别但这个基本原则是不变的。写在最后朋友们看完这5道题是不是感觉后背发凉这些题表面上考的是语法细节实际上考的是你对语言底层机制的理解。就像练武功招式好看没用得懂内功心法。现在各大厂面试越来越卷2025年甚至开始考AI模型部署和LLM调优了但基础题依然是个照妖镜。基础不牢地动山摇。那些花里胡哨的AI框架玩得再溜要是栽在this指向这种幼儿园问题上面试官只会觉得你是个调参侠不是真正的工程师。下次面试前把这5道题拿出来温习温习。遇到面试官挖坑你就淡定地填上然后看着对方惊讶的表情心里默念就这对了如果你还遇到过其他坑爹的面试题欢迎在评论区分享咱们一起研究研究看看面试官还能玩出什么花样。毕竟面试这事儿知己知彼才能百战不殆嘛。下一篇文章我准备给大家讲讲《AI时代程序员的核心竞争力到底是什么》感兴趣的朋友记得点个关注咱们下期见无意间发现了一个巨牛巨牛巨牛的人工智能教程非常通俗易懂对AI感兴趣的朋友强烈推荐去看看传送门https://blog.csdn.net/HHX_01

更多文章