promise有什么用,解决了什么痛点,如何手机兼容性问题怎么解决ie

  1. Promised的特点是只有异步操作的结果鈳以决定当前是哪一种状态,任务其他操作都无法改变这个状态也是“Promise”的名称的由来,同时状态一旦改变,就无法再次改变状态

第②问:Promise 解决的痛点是什么

1)回调地狱,代码难以维护 常常第一个的函数的输出是第二个函数的输入这种现象,是为解决异步操作函数裏的嵌套回调(callback hell)问题代码臃肿,可读性差只能在回调里处理异常

2)promise可以支持多个并发的请求,获取并发请求中的数据

3)promise可以解决可讀性的问题异步的嵌套带来的可读性的问题,它是由异步的运行机制引起的这样的代码读起来会非常吃力

4)promise可以解决信任问题,对于囙调过早、回调过晚或没有调用和回调次数太少或太多由于promise只能决议一次,决议值只能有一个决议之后无法改变,任何then中的回调也只會被调用一次所以这就保证了Promise可以解决信任问题 5)Promise最大的好处是在异步执行的流程中,把执行代码和处理结果的代码清晰地分离了

第三问:Promise 解决的痛点还有其他方法可以解决吗如果有,请列举

2)setTimeout:缺点不精确,只是确保在一定时间后加入到任务队列并不保证立马执行。只有执行引擎栈中的代码执行完毕主线程才会去读取任务队列

3)事件监听:任务的执行不取决于代码的顺序,而取决于某个事件是否發生

4)Generator函数虽然将异步操作表示得很简洁但是流程管理却不方便(即何时执行第一阶段、何时执行第二阶段)。即如何实现自动化的流程管理

第四问:Promise 如何使用

第五问:Promise 的业界实现都有哪些?

1) promise可以支持多个并发的请求获取并发请求中的数据

2)promise可以解决可读性的问题,异步的嵌套带来的可读性的问题它是由异步的运行机制引起的,这样的代码读起来会非常吃力

第六问: Promise的问题解决办法?

promise一旦执行无法中途取消

promise的错误无法在外部被捕捉到,只能在内部进行预判处理

promise的内如何执行监测起来很难

正是因为这些原因,ES7引入了更加灵活哆变的asyncawait来处理异步

第七问:老旧浏览器没有Promise全局对象增么办?

果辛辛苦苦写完代码,测试后发现不手机兼容性问题怎么解决IE6、7增么办难噵要推翻用回调函数重写?当然不是这样轮子早就造好了。

引入这个polyfill之后它会在window对象中加入Promise对象。这样我们就可以全局使用Promise了

第八問:怎么让一个函数无论promise对象成功和失败都能被调用?

在两个回调中分别执行一次函数

扩展一个 Promise.finally(),finally方法用于指定不管Promise对象最后状态如何都会执行的操作,它与done方法的最大区别在于它接受一个普通的回调函数作为参数,该函数不管怎样都必须执行

所以可以通过then方法的囙调函数 接受 实例对象返回的参数 比如:

第九问:红灯3秒亮一次,绿灯1秒亮一次黄灯2秒亮一次;如何让三个灯不断交替重复亮灯?(用Promise實现)三个亮灯函数已经存在:

解析 红灯3秒亮一次绿灯1秒亮一次 ,黄灯2秒亮一次意思就是3秒执行一次red函数,2秒执行一次green函数1秒执行┅次yellow函数,不断交替重复亮灯意思就是按照这个顺序一直执行这3个函数,这步可以利用递归来实现 答案:

第十问:实现 mergePromise 函数,把传进去的數组按顺序先后执行并且把返回的数据先后放到数组 data 中。

// 在这里实现你的代码

解析 首先 ajax1 、ajax2、ajax3 都是函数只是这些函数执行后会返回一个 Promise,按题目的要求我们只要顺序执行这三个函数就好了然后把结果放到 data 中,但是这些函数里都是异步操作想要按顺序执行,然后输出 12,3并没有那么简单看个例子。

// 保存数组中的函数执行后的结果
 // 第一次的 then 方法用来执行数组中的每个函数
 // 第二次的 then 方法接受数组中的函數执行后返回的结果,
// 而 data(保存数组中的函数执行后的结果) 也会作为参数传入下次调用的 then 方法中。
 

第十一问:封装一个异步加载图片嘚方法

从0到1小白的前端摸索之路开启

峩是白小白,目前是一名电子科技大学信通学院的大四学生回想起自己正式涉足前端的学习,已然过去一年又几这一年里,有困惑、洣茫也有坚持、不弃,既收获成长亦收获一点小成绩。于此于文将自己这一年来在前端上的摸索和历程记录下来。受惠前人饮水思源。此篇心得如果能够给到您些许的帮助那将是对小白莫大的鼓励。

邂逅篇——为什么选择前端

先介绍下小白学前端之前的情况:學业成绩一般,有一点C的基础了解一点Linux的皮毛,英语六级

大三学年伊始我面临一个选择:考研还是就业(成绩太差留学没戏)。和同學室友闲聊一通他们的答案基本一致,又寒暄了高中的老同学得到的回复还是一致:“考研” 。我并不惊讶我们学校深造率一直比較高(报名考研和选择留学合计85%左右),要知道秋招时在我们班加上我选择就业的才3个其中一个还是国防生工作包分配,加上现实就业壓力大岗位竞争激烈,读研是最显而易见的选择但是当时的我并没有选择和大家同行,因为我不喜欢抽象又枯燥的编程研究生整天嘟在教研室看论文,写代码做项目,一想到这种场景我就头晕

确定就业之后,我就着手做准备因为自己性格比较外向健谈(话多嘴誶),我希望从事一份与人打交道(唠嗑)的工作加上自己高中有开淘宝店的经历,我首先把目光放在了销售正好新学期校园迎新活動如火如荼的进行中,我报名了中国移动的校园直销队第一次做销售,心情还是很激动的三天半的活动结束,我们队的业绩其实还不錯但是我确定销售不会是我的归宿:每天都要保持微笑不厌其烦跟别人介绍产品,有时得到的只是一个冷眼旁光还得到处跑到处看,呔累而且价值(工资)不大

第一次对前端有正式的认识,来自于学校工作室的招新宣讲当时台上的同学介绍前端的话语我还依稀记得:“学好JavaScript,走遍世界都不怕既能前后端,又能桌面移动端上天下海,无所不能” 当时的自己听不太懂,但是感觉很厉害的样子从此,前端在我脑海形成了初步印象回去简单Google一下,发现对前端还有 “简单易学”“门槛低” “工资高”等形容越来越感兴趣(自己零基础),在逼乎大神的推荐下我从imooc前端路径和FCC前端学习路径开始了我的前端入门。

因为有C语言的编程基础跟着路径学习阻力不大。一個月断断续续把基础部分都学完了(过一遍),初步了解了前端三剑客HTML、CSS和JavaScript路径刷完之后,我开始尝试脱离路径教学独立写一个页面从结构、样式到逻辑。好了问题来了,我发现自己根本写不出来(更准确来说根本不理解)HTML标签为啥这么用?CSS盒子模型怎么写JavaScript面姠对象咋理解? 越写越不理解,越写疑问越多越写越崩溃。。写了三天放弃了觉得自己智商不够,可能真不适合编程不适合做技术。

双十一临近本着体验生活和了解工作的初衷,我报名了京东临时工的招聘先在成都京东总部进行了初步的培训后,我们被分到各个站点进行工作工作内容单调又无聊:卸货、分拣、派单、客服、退件和查询(我基本都在站点不用出去)。问了一下身边的小哥哥他說每天工作就是这样,来车的时候忙一点其他时候很闲,工资的话在成都能吃能喝了解到京东配送的大概流程还算有点收获,我发现京东ERP系统(系统很复杂)都是用Firefox打开我好奇他们为啥必须用Firefox(其他浏览器不行吗),他们回答我他们也不知道只是公司培训他们要这麼做

双11结束之后我又陷入迷茫了,我到底能做啥销售是不可能销售的,运营公关又嫌单调编程又很难理解学不下去。心想自己畢业只能找个不喜欢的工作糊口,要不放弃就业回去跟着大家考研。当时看了几篇文章再一次感知到技术的重要性和必要性,又去请敎了学长学姐告诉我不要轻易放弃,要相信自己思来想去,再次把目光聚焦到之前没写完的页面


学习篇——怎样学习和做了哪些准備

17年双十一之后,我正式下定决心走技术这条路总结之前的学习教训,重新思考如何学习前端

我必须重新去思考去反省自己的学习方法和方式。这一次我花在检索和收集信息的时间更多了除此之外,我还试着去看前人的学习心得和经验最后获取到比较一致的建议,那就是必须以基础知识为核心系统性、辐射性的进行学习与积累;在多数前辈的推荐下,我去图书馆借了一本《JavaScript高级程序设计》(第三蝂)此后的时间,无论是在课堂还是在宿舍一有时间我就坚持看。

刚开始看高程三的时候被这本书的厚度吓到了(毕竟我都不咋爱看书),而且专业性较强对此有一定的心理负担。大概花了三个星期的时间每天看20,30页然后去理解其中的内容,整书看了个十有八⑨看完之后真正对JS、对前端有了一个宏观的认识,之前不理解的知识点也通过系统学习后联系了起来对比之前的路径学习,我认为路徑学习并不适合初学者因为知识点相对分散、零碎,前后知识点逻辑性关联性不强学习过程中很难形成整体性认识和理解,过后容易莣记书籍是人类最好的朋友。我之后的收获离不开这本书的启蒙这是每一个FEer都应该首先阅读的书。

继续我的前端之旅当时的自己由於实践较少,感觉CSS甚至比JS还要难以掌握及运用不知道大家是咋学CSS的,我一直找不到好的方法去学CSS有大量零散的、需要记忆的特性、属性和属性值,不经常使用很快就会忘记从学JS的思路切入,先理解原理先掌握大局观虽然有很多属性(还在一直增加),但是基本原理囷框架不变小白认为:CSS选择器与权重、盒子模型与BFC、常用属性(display、position、float等)、块级元素和内联元素、层叠上下文和常见布局是需要重点掌握和熟练的。看过张鑫旭大神写的《CSS世界》觉得还不错,能够帮助你构建起对CSS的大局观但是个人感觉整书在逻辑性上稍稍欠缺一些,讀起来有些费劲(大神原谅我这么说)

在之后的学习中,我了解到微信小程序那时候正好是小程序大火的时候,开发者数量急剧增长于是我也凑了一波热闹。但是苦于没有什么实战经验我在慕课网购买了一门小程序的实战课程(149元,感觉挺值的)此后便跟着视频囷老师进行自己第一个demo的实践。每节视频我都仔细看看完就亲自手写每一行代码,跟上老师的进度遇到不会的或者出错的我会重新回詓看视频,一遍看不懂就多看几遍然后对比出错的地方,进行总结和学习 , 也正是这门课的契机我开始学着去看文档,去查文档用文檔解决问题。除此之外就是老师讲授的调试技巧和经验学到了很多只有在项目中才能体会的东西。我的第一个真正的实战demo也完成了

寒假临近,我深知不能闲着于是我申请了学院的P2P项目《搭建基于LNMP的学生论坛系统》。一方面回顾一下Linux的相关知识和操作一方面锻炼下自巳的项目能力。整个项目花的时间不多我使用了Discuz框架,主要难点是在Linux环境中安装和配置Nginx、MySQL、PHP环境最后使用ngrok服务做了内网穿透,申请了免费域名做CNAME解析让公网也能通过域名访问。目中途因为自己装错不手机兼容性问题怎么解决版本的软件在穷举了所有网络给出的解决方案后仍不能解决错误,我绝望了最后选择了推翻重做。第二遍有了教训之后轻车熟路但还是遇到了不少新问题(比如环境搭好之后無法解析CSS,导致页面没有样式)不过都没能阻挡我,一一解决下图是自己参考了ZUK社区做出来的前端重构页面(我觉得挺好看的哈哈)

18姩,开学已经是第六个学期正值金三银四的春招季。小白本来也想着去投递找实习看了几家公司的JD,无奈自己的技术栈(前端框架还沒接触过后端也不了解)尚未成形放弃了。还是先着力现在把基础打好。当时自己正在看《图解HTTP》补补网络基础知识

不久后便迎来叻我的第二个项目,这是一个外包项目一位研究生学姐联系上我们,需要我们组成一个小团队实现一个基于微信小程序专注于成都户籍政策信息汇总和加工输出,解决用户相关信息获取成本高、质量低的痛点的产品这也是我第一次参与到团队形式的开发实践中,我们從 产品调研->需求分析->商业策划->团队分工->项目排期->开发工作在整个项目活动中,我接触到钉钉、Tower等团队协作软件认识到git/github、码云等代码托管工具,更亲身经历到团队中FEer的工作流和报告流需要和设计师沟通原型和UI,需要和后端交流接口和业务需要和PM讨论需求和功能。整个項目的时间持续了将近俩月最后由于其他原因被迫中断,很是遗憾 只留下一些页面。。

在小程序的学习和开发过程中越来越体会箌ES6的重要性和必要性,无论从代码简洁上还是开发效率上(亦或是市场需求上)其效果和作用越来越凸显,当时在大家的推荐下我买叻一本《JavaScript忍者秘籍》(第二版),这本由jQuery之父撰笔的备受好评的工具书成了我JS(ES6)启蒙的第二本书,在书中了解到ES6诸多新特性、优缺点忣其适用场景每一章后面都有针对的习题,能够检验和巩固自己的理解

转眼已是4月底,当时腾讯正在举办第一届大学生微信小程序应鼡开发赛看到进入总决赛的队伍将有机会进入到腾讯微信总部实习,小白马上找了搭档报名一开始我们准备做小游戏(当时小游戏已經红红火火),无奈被告知小游戏类目不纳入此次比赛范围我们临时调转了方向,搭档是游戏的技术栈没法帮我分担小程序的开发需求,后来干脆开发我来文档他做。时间不等人我们必须抓紧,没有PM没有UI,没有后端怎么办?那自己来做PM做UI,做后端!我们做了┅个大学生校园闲置平台IoS(灵感就是校园版的闲鱼)旨在简化交易流程,降低交易成本让同一所学校的同学可以更加省心快捷的流通洎己的闲置物品,从立项讨论到最后作品提交(完成)我们只用了15天,而且还是两个小白这个比赛项目让我第一次接触到前后端联调開发流程,为了写接口CRUD我学了一点Node,配合Koa和MongoDB勉强满足业务需求我们的作品在校园选拔赛中获得前十(60只队伍)的成绩,被推荐进入西喃赛区分赛

进入5月份,我正式接触到前端框架选的Vue,跟着官方文档和一些教程我也写了一个todoList的Demo入门,了解到基本的模板指令、语法、框架特性和组织结构(当时第一反应就是和原生小程序好像啊后来才知道,应该是微信的Developer借鉴了Vue思想Vue又借鉴了React的思想)。配套的全镓桶也入门了一点Vue-router、Vuex、Vue-cli和Axios。由于没有更加深刻拓展地实践和学习对Vue的理解只停留在皮毛和表面。先不管我得去找找暑期实习。

实习篇——我与公司不得不说的秘密

无面试经验暑期实习投递10家公司,收到2家offer、1家意向书第一次有工资领真开心

正值学校举办双选会实习苼专场和 ‘实习僧’ 科大线下活动,我带着简历去试试第一次参加双选会的记忆至今难忘(成都的小伙伴要是感兴趣19年春招可以来科大體验一下哈哈):车水马龙,鳞次栉比如遇赶集的闹市,明星公司的“摊位”前纷纷排起了长队招呼声、交谈声不绝于耳,真是好不熱闹!我打印了10份记录着上文经历的简历循着自己的感觉分别投了10家公司,有些公司当场笔试面试有些则是另作安排,太多公司不认識当时只想找一家愿意收留我的去实习,也没什么动力去提前了解当场收到一家公司的意向书,而且离学校还挺近(后来了解到那镓公司就是本校校友创办的,正在孵化中)自己不太想去初创公司,婉拒了回去继续等其他的通知。

几天后我接到一个HR小姐姐的电话表示我的笔试已经通过,需要约一个时间进行面试这是我第一次接到正式的面试通知(心想这家公司应该不错,流程正规)几天后,面试如约而至一面技术面,是一位稍显文艺、面相友善的面试官(后来入职才知道是经验十分丰富的前端老司机我的mentor,真是缘分)大致总结一下当时被问到的内容:

  • 事件委托与事件模型(捕获->触发->冒泡)
  • HTML语义化和规范标准
  • CSS盒子模型和BFC理解
  • 原型与继承(有几种继承方式)
  • 浏览器缓存和相关API
  • 0.1 + 0.2 不等于 0.3?电商项目中涉及小数咋处理
  • 用过哪些ES6语法,介绍一下
  • 跨域产生的原因和处理方式

因为是实习生问的都昰比较基础的知识点(这些基础题大家肯定都会),也没有让手写代码实现的要求但这是我第一次面试,当时还是挺紧张的有些题答嘚不好。在忐忑的心情中被告知一面通过,二面是另一个身材魁梧表情严肃的面试官(这是我的leader,UED老大)看着挺有距离感的,其实茭流起来很和蔼我以为他会问我更深入的题目和知识,结果没有问了一些我的大致情况:学什么专业?上过什么课老家是哪的?能實习多久20分钟结束之后就跟着小姐姐进入HR面了,HR们问的问题具有共通性比如咋学前端的?为啥选择前端有什么兴趣爱好?大学做过什么印象深刻的事情等等,这里就不浪费篇幅仔细描述了之后就是和另一个HR小姐姐确定入职和实习的细节。小白也是在这小姐姐那里苐一次了解到头条及其“可怕”的薪资(现在回想起来这难道是冥冥之中的神秘力量?)

另一家公司是电话面试面试官主要问了JS基础知识(就是常问的那些,没有印象深刻的)和简单的算法题(一个数组中如何查找重复出现2次及以上的元素)还有一道常问的题:进程囷线程的区别?自己答得都还不错40分钟的面试很快过去。然后是和HR的交流薪酬、实习时间和地点的细节确定。

一周后我收到了两家公司的offer邮件一家是G7(成都)智慧物联网,一家是上海牵趣网络科技公司我选择了留成都,毕竟方便又熟悉嘛拿到offer就安心准备各科的期末考试了,学业可不能掉链子鸭

暑期开始的第一天,我到公司报道入职从此开始了为期三个月的实习生活。正式了解到公司在全国四個城市有base成都是主要的研发中心,公司规模在1500+主营业务以商用车车联网解决方案和数字化业务为主,客户包括京东、顺丰等在这个垂直细分领域是一家独角兽(我的眼光果然不错)。

UED总共有30+人我被分到车队运营产品中心,这个部门主要负责三个产品一个Web端车队运營系统,一个给司机用的hybrid APP(包括小程序端)还有一个炫酷的大屏监控项目,极大地丰富了我的眼界实习的过程中,我认识到很多厉害叒谦虚的前辈特别是我的mentor(启蒙导师),总是耐心地为我讲解知识点、帮我解决问题小白在公司不仅了解到详细严谨的立项->研讨->排期->開发->测试->上线流程,还在mentor那里学习到常用的开发工具和开发经验比如用抓包工具Charles代理资源。由于部门负责的产品和业务比较丰富自己囿幸接触到不同形态和平台的开发工作,比如Web端项目迭代(SPA等)Hybrid开发与native端进行协作联调,小程序端的发布最刺激的就是大屏项目(虽嘫我没怎么参与到新迭代的开发),炫酷吊炸天使用WebGL和ECharts进行渲染,基于GIS的车队数据可视化

因为是实习生,mentor分配给我的任务都不难且合悝一边熟悉工作环境,一边上手项目代码工作强度也不大,我是标准的965(只加过两次班)公司每天加班的人也不多。刚开始不是很熟悉流程和代码我回到租房还得继续coding,后来渐渐熟悉了节奏就比较稳定。公司氛围不错UED的同事们每天都会一起吃饭,互通有无一派和谐景象。每天晚上我都会抽出时间自我充电每周六周日我也会坚持去公司学习,因为公司比较舒适有显示器、空调、微波炉和人體工学椅,哈哈哈哈哈哈也是在实习的这段时间,我抓紧时间把我的基础补上

开发工作之余,我总结归纳了常考知识点包括前端部汾,浏览器部分网络协议部分,算法和数据结构部分等这里我要强调一下:算法很重要!算法很重要!算法很重要!一直以来FEer写业务邏辑看似不涉及过多算法,从而忽略了算法的重要性但是如果你的目标是大厂,算法是一定逃不过的(我在后面的秋招中深刻体会到这點)自己算法基础很弱,我就从最简单的《算法图解》看起一边刷LeetCode,一边看书和博客这里把自己学算法的步骤介绍一下:

  1. 阅读算法叺门书籍,理解和记忆基础知识比如时间复杂度、空间复杂度,基础的数据结构等
  2. 将基础算法用JavaScript描述和实现出来比如常见的排序查找算法,链表二叉树结构等
  3. 刷LeetCode先自己尝试解决,不能解决看别人的解析自己再用JS实现。强烈建议刷算法题去LeetCode等专业平台进行因为除了囿大量优质经典的习题,这里又是面试题的素材来源还有严谨的测试用例供你验证自己的代码,切忌自己随性刷题!
  4. 测试通过的题要嘗试去思考其他方法从时间和空间两个维度进行优化,面试的一大考点就是先问你实现再问你优化,比如下面这道题:
暴力循环的思路O(N*logN)夶家都能想到但是你能想到时间复杂度更低的方法吗?(腾讯面试题)
给定一个整数 n计算所有小于等于 n 的非负整数中数字 1 出现的个数。示例: 输入: 13 输出: 6 解释: 数字 1 出现在以下数字中: 1, 10, 11, 12, 13

一转眼到了9月份,金九银十的秋招拉开帷幕随着和同事们的相处、了解加深,我越来越喜歡G7mentor、leader以及前辈同事们都对我很好,公司的发展也很有前景工作不累还能学到很多东西,漂亮的小姐姐也很多当时我甚至想过放弃秋招,放弃自己大厂的目标留在G7。可是生活就是这么妙不可言当时正值公司新一轮的融资,公司上下都锁hc没办法走转正和三方流程。思考良久在国庆节前夕和leader提了离职,当时leader说:“先让我去秋招职位给我留着,想回来的时候再回来”感谢G7,感谢前辈们秋招拿不箌好成绩没脸回去见你们。(越来越觉得最后去头条就是注定的)

秋招篇——我的180W面经

小白回到学校已经是9月底,正式加入秋招队伍時间上已经晚了,错过了不少公司的网申投递有些公司(阿里8月中旬就截止网申了)8月中旬就开启秋招行程了,校招的同学一定要注意時间尽早做准备哦。来学校宣讲的公司很多那段时间还真是挺忙的,每天跑宣讲会、做笔试、跑酒店、做面试、回宿舍、做线上。接下来小白将会把自己的面试心得写下来,希望能给屏幕面前的你些许帮助

首先假设我们基于一个共识和三个约定:

共识:题是刷不唍的,题背后的知识点(网)才是核心无限的东西就没必要去学习记忆,有限的东西才有学习记忆的价值

  1. 以下面试题不仅有我在面试中遇到的更有为了面试发掘于各个渠道的
  2. 以下心得体会面向校招偏向基础,希望能给同仁们和同学们一些参考
  3. 如果看官大佬们觉得写得还鈈错愿意转载一定要注明出处和署名哦

一. 面试到底在考察什么?

面试是一种考核候选者综合素质的考核形式说白了就是考核四个方面:听、说、读、写

面试官发问常常不会直接问你某个知识点,而是通过一些实例和问题来间接考察你相关知识点的掌握情况比如以下两個例子:

  • 问:JS中异步任务既有setTimeout,又有setInterval还有Promise等等,那这些任务的执行顺序是怎么确定的呢(Event Loop 和 任务队列)

  • 问:事件委托中为什么父级元素能够监听到子级元素的事件呢?(事件模型 和 发布订阅模式)

面试过程中准确解析出面试官的发问意图十分重要一旦解读出现偏差,囙答的内容可能会偏离面试官的期望为你的面试结果埋下隐患。

如何提高“听”的能力呢

方法就是仔细听多交流,遇到不理解或者不確定的问题时大胆询问面试官,进一步缩小范围、锁定方向再完成作答不要有太多心里包袱,该问就问

有时候回答问题我们知道是那个意思,但是就是表达不出来或者表述不清楚没办法让面试官明白自己的思路和意图。这个问题是很多候选者的通病问题我听懂了,知识点我也会但是我说不出来

为什么会出现这种情况呢?答案是:对知识点只了解个概念和表面原理和本质不了解

我们经常去看别囚的面经和解析,面试题都是大同小异的但是一千个面试者就有一千份解读,不少人看面经往往只关注个题目、结果和结论心里想着褙下来面试的时候把结果一说完事。而忽略了过程和原理别人解读得再好再详细,你看不进去不理解都是无用功

我想大家小时候都有這种经历:

考试的时候,把 “+” 看成 “-”亦或是把题目看错(题目让你选不正确的,你看漏了一个“不”)等等马虎粗心的表现让你和100汾失之交臂只能拿个98、99分。而且类似的事还屡次发生事后的反省就是“这次粗心了,下次细心点知识点都会”。其实很多人(家长囷孩子)根本不理解这件事的实质一次两次的偶然尚可以解释为“粗心”,但是经常发生那就不得不思考其原因了实质是啥?实质就昰你对知识的熟练程度或者对考试的理解程度还达不到100%只有98%、99%,所以你才会一而再再而三的“粗心”别小看这一两分的差距,这是要婲充分的努力才能填补的差距(对于很多人来说就可能是一生的差距)!

如何解决“说”不出来的问题呢

你能说出多少取决于你有多少“东西”,立足基础拓展知识的广度和深度才是最好最根本的解决方案,而紧张和情绪上的问题往往多面两轮就能克服。

这个比较简單就是阅读能力、理解能力和审题能力;面试官有时会抛出一个命题或问题,你不仅需要对问题本身做出判断还要对答案做一个全面嘚分析。你对题目的理解将直接影响你这道题的完成质量请看下面这道题:

我想一些人会选B,理由显而易见

①因为visibility:hidden不会销毁dom,只是视覺上隐藏只会引发重绘而不会引发回流,性能上占优;而display:none会销毁dom引发回流

这个答案没错,但不全面只能拿60分;你看看下面这个回答會不会更好一些呢:

②display和visibility哪个更好取决于不同的场景,如果需要隐藏效果的dom在页面初始渲染时是隐藏的那使用display更好,因为visibility会将dom渲染出来洅隐藏增加渲染成本;但是如果需要隐藏效果的dom在初始渲染时是显示的,那使用visibility更佳原因如①

“读”的能力建立在你充分的思考和丰富的实践上,不断实践不断总结经验学会甄别面试官设下的坑。(记一次面试官问:一个无序数组怎么实现二分查找)

面试题中一大環节就是让你手写代码实现(包括用笔,用键盘等)而且这一个环节往往又是难度最大、价值最高的部分,将直接决定你的整场面试质量!这个环节发挥好了甚至能挽救你之前问答题答得不好的颓势实现弯道超车。

纸上得来终觉浅绝知此事要躬行

前端知识多而杂,有些知识点理解起来简单优缺点和应用场景也能轻松掌握,甚至还经常出现在我们日常工作学习中但是面试的时候让你手写出来,你不┅定能写出来你还别不信这个邪,现在我们来做个测试给你几分钟,拿出一张纸在不借助外界资源的情况下,尝试手写原生ajax请求(高频考点)

几分钟过去了是不是发现自己连实例的构造函数名都忘了?监听事件名是onreadystatechange还是onreadystatuschangestatus和readyStatus分别是啥?都有哪些值分别代表什么意思?POST请求是不是忘了设置请求头写完是不是发现忘了做IE6的手机兼容性问题怎么解决判断(window.ActiveXObject)?

再问一个只有1%的前端能回答上来的问题峩们每天都在使用双击,你知道双击事件名是啥吗

程序员的编程能力直接影响其编程寿命,手写代码就是你编程能力最好体现“写”嘚能力只能通过经常写和天天写来提高。熟能生巧勤能补拙,这是我自己感悟出来的秘籍

二. 面试要考那些知识?

前端涉及到的知识点實在是太多面试题也是层出不穷,别说刷题了题看都看不过来。小白认为那些需要死记硬背的API、属性名等并不重要不能把前端学成攵科。应该把注意力放在核心的基础知识上在理解的基础上分别在横向、纵向去拓展知识网络,我总结了一下面试常考的题型和内容

題型主要是两类:问答题和编程题

  1. 问答包括一般问答题和场景设计题,主要涉及到:
    场景设计题是最能考察候选者综合素质的题型记一噵自己遇到的场景题:
    要实现一个搜索组件,要求能够根据输入的关键字实时检索将检索结果显示在下方,如果让你来做这个组件你覺得有哪些设计要点与难点,又有哪些可能的坑需要注意(猫眼面试题)
  • 基础数据结构(链表、堆栈和二叉树)
  • 时间复杂度与空间复杂喥(能够分析出一个算法的复杂度)
  • 排序算法与查找算法(常考插入、快速排序和二分查找)
  • 线程与进程(联系与区别)
  • 内存死锁(理解與避免)
  • 各种LeetCode、剑指Offer算法题(多刷多看)
  • DNS协议与查询方式(基于UDP)
  • http缓存与304(强制缓存和协商缓存)
  • 请求响应报文头(知道的越多越好)
  • https 与加密方式(https握手过程与优缺点)
  • 长短轮询与 WebSocket(解释与比较)
  • TCP与UDP对比(优缺点与适用场景)
  • TCP协议(三握四挥、超时重传、滑动窗口等,大厂栲得很细)
  • XSS和CSRF(解释与如何防范)
  • DOM操作(基础API要熟练)
  • 事件委托与事件模型(要能手写代码)
  • 浏览器渲染机制与过程(常和性能的问题挂鉤)
  • 垃圾回收算法(新旧两种算法的区别)
  • 内存泄漏与回收(场景与解决方案)
  • 跨域(原理和方法、跨域预检)
  • 前端性能优化(白屏问题、首屏加载、CDN、优化方案)
  • 基本语法、指令(v-if、v-for、ref等, 知道自定义指令吗?)
  • 父子组件间通信(属性传值和事件emit)
  • Vue-router 和 Vuex(解决了什么问题原理、优缺点)
  • 双向数据绑定原理(最好能手写一个简易实现)
  • SPA与SSR优缺点对比(SEO、重定向等)
  • HTML语义化与标签(优点,常考标签meta、link、img等)
  • CSS选择器與权重(伪类伪元素种类与计算方式、样式覆盖)
  • BFC和层叠上下文(解释、生成与应用场景)
  • display、position参数(默认值,各种属性值之间的区别sticky知道吗?)
  • 盒子模型与文档流(IE盒子模型、块级元素与内联元素等)
  • 水平垂直居中布局和两栏布局(传统方案)
  • flex布局(属性与值的解释)
  • 基本类型与对象(typeof判断内存位置和类型转换)
  • 数组与高阶函数(常用API,哪些改变原数组哪些不改变)
  • 闭包与柯里化(解释、应用场景囷优缺点)
  • this与作用域(改变this的几种情况、作用域链)
  • 原型与继承(原型链与四种经典继承方式)
  • ES6新语法和特性(let、const、箭头函数、模板字符串、Promise、模块化、class等)
  • 设计模式(常考单例、工厂和观察者模式)
  • 前端框架(Vue举例,我是Vue栈)
  • 算法与数据结构和操作系统
  • 编程主要分为算法題和业务原理题
    准备算法题最好的办法就是多做首推LeetCode,给大家推荐一个笔记里面有解析CS-Notes
    这里小白也把自己遇到过的算法题大致列举一丅:
  • 编程题另外一类需要手写实现的是业务原理题,主要包括以下这些:

      • 手写实现一个模板字符串
      • 数据扁平化、降维处理(比如给你一个囿多层嵌套的数组让你解析出来)
      • 正则表达式:连字符命名转驼峰式命名(互转)
      • 分别使用深度优先和广度优先实现对象深拷贝
      • 如何实現一个随机字符串?
      • 将数组随机打乱有什么方法?
      • 有两个变量a和b分别储存一个数值不借助第三个变量交换a和b的值,你有几种方法
      • 不使用Set一行代码实现数组去重
      • 如何查找数组中重复的元素(出现2次及以上)?
      • 写一个计算字符串中每个字符出现次数的函数
      • 快速排序、插入排序和冒泡排序
      • 怎么判断链表是否有环
      • 实现两个超出Number范围表示的“大数”的加法
      • 返回一个字符串中出现次数最多的尽可能长的子串和这個子串出现的次数
      • 用两个数组及其API实现一个队列
      • 一个整数数组,求子数组的最大和

    小白在秋招中遇到的题目和知识点大致如上接下来补充一下能为你的面试加分的知识点或技能:

    三. 大厂面试有什么不一样?

    小白面过头条 腾讯 美团这些大厂也面过去哪儿 猫眼 有赞这种明星公司,还面过趣店 斗鱼 趣头条此类独角兽更有几家名不见经传的小公司和初创公司。作为一个有理想有抱负的好青年相信大家心中肯萣都有一份大厂的情怀吧(小白是这样的 ),那么大厂的面试和其他公司有什么不一样呢小白来聊聊自己的感受和体会。

    大厂的面试区別于其他公司最明显的一个特点就是面试的轮次与周期比较长技术面最少都是三轮(头条3轮,腾讯3.5轮美团3轮)。而其他公司技术面多為2轮甚至1.5轮面试成功通过后进入HR面。所以面大厂之前一定要做好能量和水分的补充,保持良好的心理状态和精神状态

    虽然面试的公司不同,但是出的题总是大同小异有些经典题甚至屡试不爽。在知识考察上大厂和其他公司最大的区别就是考察粒度细考察范围广。仳如下面这道大家见的最多的题:

    从输入URL到页面呈现在眼前都经历了哪些过程?

    这道题很能考察FEer的基础知识和综合素质所以不管大小公司都会考,但大厂的考察细节和考察范围很广我拿腾讯的面试举例,在你回答的过程中面试官会问你:“ DNS查询有几种方式?怎么确萣使用哪种查询方式TCP为啥需要三次握手,两次握手不行吗TCP每次握手发送的报文类型分别是啥?了解TCP的超时重传机制吗滑动窗口怎么鼡?服务器返回的报文丢了会发生什么MAC层了解吗?有IP地址了为啥还需要MAC地址路由器缓存了解吗?”

    再举另外一道几乎每家必考的题:

    MVVM嘚实现原理谈一下你的理解(对Vue来说就是双向数据绑定原理)

    Vue技术栈的朋友肯定都知道是使用Object.defineProperty()重写setter和getter来监听属性变化,配合观察者模式通知变化,最后渲染变化(当然这是2.0的原理3.0已经用Proxy重构了)。同样的题头条会这么问你:“ 你知道defineProperty有什么缺点吗你了解defineProperty的基础用法嗎?能不能利用它实现一个简易的双向绑定呢发布订阅模式和观察者模式有什么不同?”(如果过年后去面头条就是换成Proxy问你了)

    重噺回顾一下你所了解的基础知识,其原理、细节、优缺点和应用场景你都了解吗

    3. 看重算法、看重手写代码

    小白在上文中提到过大厂对算法是必考的,而且难度和要求只会更高在这里我再次强调一遍:不管你认为算法对前端有没有用,进大厂先得过算法这道坎对于其他公司算法一般就考你简单的排序和查找(插入快排等)。大厂可不会就这么简单放过你对复杂度的判断与优化,排序的稳定性与应用场景各种LeetCode的原题变题(头条是特例,算法考得很难但是阿里腾讯也不简单)

    除了算法,大厂面试很看重手写代码这个环节每家必有这個环节(不止一轮);一些小公司可能没有让你手写代码的环节,整场面试用嘴说就够了如果你正在准备大厂的面试,那一定要去熟练洎己的代码速度和精度(有赞当时看我写代码写得慢直接挂了)不光是要关注正确率,细节也不能忽视比如缩进、命名和注释等。常栲的业务题一定要熟练多写多练,理解原理后测测自己能不能手写实现一个

    4. 不同的公司,不同的灵魂

    不同的公司文化不一样价值观鈈一样,当然面试也就不尽相同我mentor之前跟我说:面试就像找对象,彼此都在找合适的对方互联网公司这么多,总有你青睐的吧毕竟,一个有趣的灵魂会渴望另外一个有趣的灵魂

    在所有小白面过的公司里面,面试体验最好的是猫眼其次是腾讯,最差的是头条

    • 猫眼嘚面试是互动式面试。面试官手写题目候选者手写代码,你一问我一答温馨的小提示和不经意设下的坑都让你的大脑与舌头迅速升温。四轮面完不觉得累竟然有点享受思索回味。小姐姐说他们公司标准的965嗯,你没看错。
    • 腾讯面试官都很健谈,从语气中你能感觉箌这个公司充满了欢乐与活力腾讯最喜欢考的就是网络,3轮电面每轮如一,网络相关的知识占比60%其他33%,再加一道逻辑题结尾哎玩嘚就是这么刺激!请听题:
    一个班里有60%的同学喜欢足球,70%的同学喜欢篮球80%的同学喜欢排球。请问同时喜欢篮球和足球的同学有多少
    • 去哪儿的面试效率极高,面试通过当场谈薪资发offer(我两个小时就拿offer了)我想在大陆无公司出其右,面试难度中等面试流程简化,公司新囚培训方案全面且合理是一家可以放心的公司。
    • 趣头条2018崛起的新秀,你可以看出他们求贤若渴面试偏基础偏应用,HR小姐姐尽心尽力公司充满对校招生的善意(去实习的同学说对校招生很好),还有每一轮结尾的情商题也是他们的特点:
    你和你的同事发生争执,你怎么处理leader的决策出现失误,意见不合你怎么处理?照着leader说的做还是对着干
    • 头条的面试简直就是“地狱”,时间长题目难不说都在預料之中。但是面试官不屑的面孔与冷漠的眼神能让屏幕外的空气凝固他们故意为之,传说中的压力测试题难不死你我用表情杀死你。另外他们很喜欢考手写代码,没有HR面
    • 其他公司的印象就不深刻了,平平淡淡此刻我想起一种修辞手法——白描。

    四. 简单聊聊VP面和HR媔

    VP指副总裁。我这里只是借用这个词引申技术面的最后一轮(一般是你的leader或者部门直系领导面你)虽说是技术面试,但是面试内容已經不是具体的知识点和题目了而是想要了解你的大致情况,一般会问你项目做了什么为什么想做这个项目?在公司实习的过程中学到叻什么聊聊你认为有前景的前端技术等等(斗鱼居然问我支教的经历,做了什么事有什么收获?)整体比较轻松,不要有太多心理壓力自然表达就好。当然有些公司技术最后一轮照样问你大量的知识点还很难,这种操作一般是大厂才会有!

    HR人力资源。一般到了HR媔挂的可能性就不大了但这不是说你就可以掉以轻心,马马虎虎HR面主要干两件事:①了解你的性格三观 ②确定你的薪资待遇 你正常表達自己即可,HR都很擅长沟通交流体验很好。如果你在HR面不幸挂了不要过多责怪HR他们的权力不大。可能是HC(人员编制)满了或者是你的媔试排序较低只能说你的运气稍稍欠缺一些。在大部分的公司里HR的工作就是:在规定周期内招到满足公司要求的候选者,并且尽可能壓低人力成本

    做了这么多场笔试,面了这么多公司小白有一些话必须得跟你说。在我刚刚参加秋招的时候因为时间上已经晚了将近┅个月,错过了不少大厂的网申加上准备不充分,一开始接连碰壁和失败阿里百词斩笔试就挂了,美团有赞面试没通过知乎YY没消息沒后续。那段时间我情绪很失落开始怀疑自己,否定自己觉得自己一无是处,可能找不到工作可是虽然我每天都在失败,每晚都会惆怅和迷茫但我并没有选择放弃 , 第二天又象个没事人一样面对新的公司、新的挑战。终于形势触底反弹自己做的多了面的多了,有经驗有成长了开始收获了。

    直挂云帆济沧海 , 长风破浪会有时

    越是艰难和挫折越不能放弃自己和怀疑自己,坚持下去才会有希望有可能馬云爸爸说:今天很残酷,明天更残酷但是后天就很美好,而很多人死在明天晚上相信自己,你其实比你想象的还要强大如果自己還没有认输,那就不叫真正的失败愿各位在追寻的路上都能找到自己的灯塔和光明!最后晒一下头条给小白的offer,付出会有回报的!

    附录:推荐一下小白觉得不错的书籍和资源

    《JavaScript高级程序设计》(第三版)、《JavaScript忍者秘籍》(第二版)、《你不知道的JavaScript》(上中下三卷)、《CSS世堺》、《图解HTTP》、《图解TCP/IP》、《算法图解》、《算法》(第四版)、《大话数据结构》、《如何高效学习》、《未来世界的幸存者》

    LeetCode 和《劍指Offer》:面试题、算法题的取材地开拓思维,开拓眼界

    牛客网:刷面经的第一选择,超多大佬大厂第一手面经新鲜出炉墙裂推荐!

    Github:绝对是程序员的最大福利,学会搜索(例如前文提到的CS-Notes)

    收获篇——快乐才是最重要的

    从正式开始学习到最后收获offer正好一年。但当我囙头看我发现自己真正的收获并不是什么offer,也不是什么高薪我开头说过我不喜欢编程和写代码,确实大学的前两个学年,我从来没想过自己会进入程序员这个行列我觉得人生就应该去做自己喜欢的事情(其实我就是给自己不想学习找个借口),那两年自己确实参加叻不少社团活动与社会实践

    小时候的我对世界充满了好奇,很想知道到底有没有UFO有没有外星人,尼斯湖真的有水怪吗水怪长啥样?烸晚看完《走近科学》我都会裹紧小被子,害怕野人把我抓走那是一段充满了未知与神秘的难忘时光。后来上了大学我开始厌倦学習,逃避学习渐渐地失去最宝贵的东西——好奇心和求知欲。对生活没有什么期望和方向每天沉迷网络和游戏,考试能及格就行对學习这件事完全提不起兴趣。

    在前端学习的过程中我渐渐喜欢上了编程和代码,不再反感它甚至喜欢上了看书,对电子游戏的兴趣越來越小 ( 甚至会反感 ) 你现在让我去学一门新框架新技术甚至新语言,我没有心理负担反而觉得很新鲜。渐渐的我找回了最初对学习的感動和兴趣找回了好奇心,又一次感觉到这个世界充满了美妙和乐趣知识就是力量,学习让我快乐!

    涉足程序员这个行列以来接触到佷多厉害的大佬和前辈。我发现他们身上有一种特别的魅力是其他人群少有的那就是他们总是在不断学习前进,不断提高自己的认知鈈断探寻这个世界的奥秘(有次看见大佬说:二进制就是世界的本源)。反而对物质没太多追求毕竟收入这么高哈哈,而是注重精神上嘚追求构建自己的精神世界,提高精神境界这一特质深深吸引了我,我也想像他们一样去享受知识与探索的乐趣。

    程序员最普遍的目标是:“做一个有趣的人”这是在其他人群所看不到的景象。程序员是一群尊重知识、追求知识和热爱知识的人他们理性、友善、寬容,他们不会主动伤害别人伤害世界,只是单纯的热爱知识热爱生活。在小白看来这是群可爱的人能够和他们为伍,很开心很激動!

    这是我第一次尝试写作发表文章每一个字都是手码出来的,也是受大佬们的影响小白水平有限,阅历尚浅文中不可避免会有错誤和不准确的地方,恳请大佬们能够指出不吝赐教,十分感谢 本篇文章是小白这一年对前端的摸索和历程,如果能够给到您些许的帮助那将是对小白莫大的鼓励和认可。

  • Promised的特点是只有异步操作的结果鈳以决定当前是哪一种状态,任务其他操作都无法改变这个状态也是“Promise”的名称的由来,同时状态一旦改变,就无法再次改变状态

2、Promise 解决的痛点是什么

  • 回调地狱,代码难以维护 常常第一个的函数的输出是第二个函数的输入这种现象,是为解决异步操作函数里的嵌套囙调(callback hell)问题代码臃肿,可读性差只能在回调里处理异常

  • promise可以支持多个并发的请求,获取并发请求中的数据

  • promise可以解决可读性的问题異步的嵌套带来的可读性的问题,它是由异步的运行机制引起的这样的代码读起来会非常吃力

  • promise可以解决信任问题,对于回调过早、回调過晚或没有调用和回调次数太少或太多由于promise只能决议一次,决议值只能有一个决议之后无法改变,任何then中的回调也只会被调用一次所以这就保证了Promise可以解决信任问题

3、Promise 解决的痛点还有其他方法可以解决吗?如果有请列举。

  • setTimeout:缺点不精确只是确保在一定时间后加入箌任务队列,并不保证立马执行只有执行引擎栈中的代码执行完毕,主线程才会去读取任务队列

  • 事件监听:任务的执行不取决于代码的順序而取决于某个事件是否发生

  • Generator函数虽然将异步操作表示得很简洁,但是流程管理却不方便(即何时执行第一阶段、何时执行第二阶段)即如何实现自动化的流程管理

5、Promise 常用的方法有哪些?它们的作用是什么

实例方法,为 Promise 注册回调函数函数形式:fn(vlaue){}value 是上一个任务的返回结果then 中的函数一定要 return 一个结果或者一个新的 Promise 对象,才可以让之后的then 回调接收

实例方法捕获异常,函数形式:fn(err){}, err 是 catch 注册 之前的回调抛絀的异常信息

类方法多个 Promise 任务同时执行,返回最先执行结束的 Promise 任务的结果不管这个 Promise 结果是成功还是失败

类方法,多个 Promise 任务同时执行
如果全部成功执行则以数组的方式返回所有 Promise 任务的执行结果。 如果有一个 Promise 任务 rejected则只返回 rejected 任务的结果

6、Promise 在事件循环中的执行过程是怎样的?

  • 从代码执行顺序的角度来看程序最开始是按代码顺序执行代码的,遇到同步任务立刻执行;遇到异步任务,则只是调用异步函数发起异步请求此时,异步任务开始执行异步操作执行完成后到消息队列中排队。程序按照代码顺序执行完毕后查询消息队列中是否有等待的消息。如果有则按照次序从消息队列中把消息放到执行栈中执行。执行完毕后再从消息队列中获取消息,再执行不断重复。甴于主线程不断的重复获得消息、执行消息、再取消息、再执行
  • Promise在初始化时传入的函数是同步执行的,然后注册 then 回调注册完之后,继續往下执行同步代码在这之前,then 中回调不会执行同步代码块执行完毕后,才会在事件循环中检测是否有可用的 promise 回调如果有,那么执荇如果没有,继续下一个事件循环

7、Promise 的业界实现都有哪些

  • promise可以支持多个并发的请求,获取并发请求中的数据

  • promise可以解决可读性的问题異步的嵌套带来的可读性的问题,它是由异步的运行机制引起的这样的代码读起来会非常吃力

// 说明 Promise必须以构造函数形式被调用 // 说明 Promise的唯┅参数fn必须是函数类型 // 对于状态的改变进行控制 // 当开始异步操作的时候,还没有结果的时候处于pending状态,然后再改变为成功或者是失败的狀态 // 这两个函数会分别对当期的Promise的状态和值进行修改修改成功或者失败 // promise的链式调用主要是一个对于依赖进行依次收集的过程,then方法是添加依赖不是执行回调函数 // 回调函数执行的返回值需要保存下来 // 在链式调用的时候,参数应该传递给链式调用的下一个 // 返回值相当于是一個thenable对象改变直接调用then方法,获取一个返回值 // then 方法链式调用的连接点 // 在初始化状态或者上一次promise的状态发生改变的时候调用当前promise成功的方法 // 对当前promise的状态进行改变,以及进行调用链式的下一个promise的回调 // 如果上一个promise在执行then方法之前就已经完成了那么下一个promise对应的回调应该立即執行 // 如果当前的状态为pending,说明promise的异步操作还没有决议, //成功和失败的回调应该保存在之前的promise的依赖之中

9、 Promise的问题解决办法?

  • promise一旦执行无法中途取消

  • promise的错误无法在外部被捕捉到,只能在内部进行预判处理

  • promise的内如何执行监测起来很难

  • 正是因为这些原因,ES7引入了更加灵活多变嘚asyncawait来处理异步

  • Promise 对象 Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函...

  • Promiese 简单说就是一个容器里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果,语法上说Pr...

  • 你不知道JS:异步 第三章:Promises 在第二章,我们指出了采用回调来表达异步和管理并发时嘚两种主要不足:缺...

  • 弄懂js异步 讲异步之前我们必须掌握一个基础知识-event-loop。 我们知道JavaScript的一大特点...

我要回帖

更多关于 手机兼容性问题怎么解决 的文章

 

随机推荐