引言
元旦匆匆而过,2020年的春节又接踵而来,大家除了忙的提着裤子加班、年底冲冲冲外,还有着对于明年的迷茫和期待!2019年有多少苦涩心酸,2020年就有更多幸福美好,加油,奥利给!怀着一颗积极向上的心,来面对未来每一天的挑战!
所谓“兵马未动,粮草先行”,我们打响明天的战役也需要精神食粮来做后勤保障才是。在此我整理了多位从业者和我在2019年底至2020年初的一厂面试精选题,希望对磨砺锋芒、奋发向上的小伙伴有所帮助,祝你早日剑指大厂,扬帆起航,奥利给!
浏览器
1.实现一个postMessage跨域 (快手一面 2019.08)
window.parent.postMessage('message', 'http://test.com')
var mc = new MessageChannel()
mc.addEventListener('message', event => {
var origin = event.origin || event.originalEvent.origin
if (origin === 'http://test.com') {
console.log('验证通过')
}
})
2.node和浏览器的事件循环机制区别 (京东到家二面 2019.04)
浏览器环境下,microtask 的任务队列是每个 macrotask 执行完之后执行。而在 Node.js 中,microtask 会在事件循环的各个阶段之间执行,也就是一个阶段执行完毕,就会去执行 microtask 队列的任务。
浏览器和 Node 环境下,microtask 任务队列的执行时机不同
- Node 端,microtask 在事件循环的各个阶段之间执行
- 浏览器端,microtask 在事件循环的 macrotask 执行完之后执行
参考地址:https://juejin.im/post/5c337ae06fb9a049bc4cd218
3. cookie,localStorage,sessionStorage,indexDB的区别(网易互娱 2019.11)
- cookie数据始终在同源的http请求中携带(即使不需要),即cookie在浏览器和服务器间来回传递。而sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存。
- 存储大小限制不同,cookie数据不能超过4k,同时因为每次http请求都会携带cookie,所以cookie只适合保存很小的数据,如会话标识。sessionStorage和localStorage虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大。
- 数据有效期不同,sessionStorage:仅在当前浏览器窗口关闭前有效,自然也就不可能持久保持;localStorage:始终有效,窗口或浏览器关闭也一直保存,因此用作持久数据;cookie只在设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭。
- 作用域不同,sessionStorage不在不同的浏览器窗口中共享,即使是同一个页面;localStorage 在所有同源窗口中都是共享的;cookie也是在所有同源窗口中都是共享的。
特性 |
cookie |
localStorage |
sessionStorage |
indexDB |
数据生命周期 |
一般由服务器生成,可以设置过期时间 |
除非被清理,否则一直存在 |
页面关闭就清理 |
除非被清理,否则一直存在 |
数据存储大小 |
4k |
5M |
5M |
无限 |
与服务端通信 |
header中,对于请求性能影响 |
不参与 |
不参与 |
不参与 |
4. cookie某些属性的作用?
属性 |
作用 |
value |
如果用于保存用户登录态,应该将该值加密,不能使用明文的用户标识 |
http-only |
不能通过JS访问Cookie,减少XSS攻击 |
secure |
只能在协议为HTTPS的请求中携带 |
same-site |
规定浏览器不能在跨域请求中携带Cookie,减少CSRF攻击 |
4.输入URL发生什么?(蚂蚁金服一面 2019.03)
- DNS 域名解析(域名解析成ip地址,走UTP协议,因此不会有握手过程):浏览器将 URL 解析出相对应的服务器的 IP 地址(1. 本地浏览器的 DNS 缓存中查找 2. 再向系统DNS缓存发送查询请求 3. 再向路由器DNS缓存 4. 网络运营商DNS缓存 5. 递归搜索),并从 url 中解析出端口号
- 浏览器与目标服务器建立一条 TCP 连接(三次握手)
- 浏览器向服务器发送一条 HTTP 请求报文
- 服务器返回给浏览器一条 HTTP 响应报文
- 浏览器进行渲染
- 关闭 TCP 连接(四次挥手)
5. 强缓存和协商缓存(蚂蚁金服一面 2019.03)
- 强缓存 可以通过设置两种 HTTP Header 实现:Expires 和 Cache-Control 。强缓存表示在缓存期间不需要请求,state code 为 200。
- Expires 是 HTTP/1 的产物,表示资源会在 Wed, 22 Oct 2018 08:41:00 GMT 后过期,需要再次请求。并且 Expires 受限于本地时间,如果修改了本地时间,可能会造成缓存失效。
- Cache-Control 出现于 HTTP/1.1,优先级高于 Expires 。该属性值表示资源会在 30 秒后过期,需要再次请求。
指令 |
作用 |
public |
表示响应可以被客户端和代理服务器缓存 |
private |
表示响应只可以被客户端缓存 |
max-age=30 |
缓存30秒后就过期,需要重新请求 |
s-maxage=30 |
覆盖max-age,作用一样,只在代理服务器中生效 |
no-store |
不缓存任何响应 |
no-cache |
资源被缓存,但是立即失效,下次会发起请求验证资源是否过期 |
max-stale=30 |
30秒内,即使缓存过期,也使用该缓存 |
min-fresh=30 |
希望在30秒内获取最新的响应 |
- 协商缓存 如果缓存过期了,就需要发起请求验证资源是否有更新。协商缓存可以通过设置两种 HTTP Header 实现:Last-Modified 和 ETag 。当浏览器发起请求验证资源时,如果资源没有做改变,那么服务端就会返回 304 状态码,并且更新浏览器缓存有效期。
- Last-Modified 表示本地文件最后修改日期,If-Modified-Since 会将 Last-Modified 的值发送给服务器,询问服务器在该日期后资源是否有更新,有更新的话就会将新的资源发送回来,否则返回 304 状态码。但是 Last-Modified 存在一些弊端:1.如果本地打开缓存文件,即使没有对文件进行修改,但还是会造成 Last-Modified 被修改,服务端不能命中缓存导致发送相同的资源;2.因为 Last-Modified 只能以秒计时,如果在不可感知的时间内修改完成文件,那么服务端会认为资源还是命中了,不会返回正确的资源
- ETag 类似于文件指纹,If-None-Match 会将当前 ETag 发送给服务器,询问该资源 ETag 是否变动,有变动的话就将新的资源发送回来。并且 ETag 优先级比 Last-Modified 高。
- 启发式缓存 如果什么缓存策略都没设置,那么浏览器会怎么处理?对于这种情况,浏览器会采用一个启发式的算法,通常会取响应头中的 Date 减去 Last-Modified 值的 10% 作为缓存时间。
6. 实际场景应用缓存策略举例
- 频繁变动的资源 对于频繁变动的资源,首先需要使用 Cache-Control: no-cache 使浏览器每次都请求服务器,然后配合 ETag 或者 Last-Modified 来验证资源是否有效。这样的做法虽然不能节省请求数量,但是能显著减少响应数据大小。
- 代码文件 这里特指除了 HTML 外的代码文件,因为 HTML 文件一般不缓存或者缓存时间很短。一般来说,现在都会使用工具来打包代码,那么我们就可以对文件名进行哈希处理,只有当代码修改后才会生成新的文件名。基于此,我们就可以给代码文件设置缓存有效期一年 Cache-Control: max-age=31536000,这样只有当 HTML 文件中引入的文件名发生了改变才会去下载最新的代码文件,否则就一直使用缓存。
7. 重绘(Repaint)和回流(Reflow)是啥?如何优化?(快手一面 2019.08)
- 重绘是当节点需要更改外观而不会影响布局的,比如改变 color 就叫称为重绘。
- 回流是布局或者几何属性需要改变就称为回流。
回流必定会发生重绘,重绘不一定会引发回流。回流所需的成本比重绘高的多,改变父节点里的子节点很可能会导致父节点的一系列回流。
- 优化方案:
- 使用 transform 替代 top
- 使用 visibility 替换 display: none ,因为前者只会引起重绘,后者会引发回流(改变了布局)
- 不要把节点的属性值放在一个循环里当成循环里的变量
- 不要使用 table 布局,可能很小的一个小改动会造成整个 table 的重新布局
- 动画实现的速度的选择,动画速度越快,回流次数越多,也可以选择使用requestAnimationFrame
- CSS 选择符从右往左匹配查找,避免节点层级过多
- 将频繁重绘或者回流的节点设置为图层,图层能够阻止该节点的渲染行为影响别的节点。比如对于 video 标签来说,浏览器会自动将该节点变为图层。
8. 同源策略是什么?(网易互娱 2019.11)
同源策略是指只有具有相同源的页面才能够共享数据,比如cookie,同源是指页面具有相同的协议、域名、端口号,有一项不同就不是同源。 有同源策略能够保证web网页的安全性。
DOM 同源策略:禁止对不同源页面 DOM 进行操作。这里主要场景是 iframe 跨域的情况,不同域名的 iframe 是限制互相访问的。
XMLHttpRequest 同源策略:禁止使用 XHR 对象向不同源的服务器地址发起 HTTP 请求。
跨域解决方法: 1. CORS(跨域资源共享); 2. JSONP跨域; 3. 图像ping跨域; 4. 服务器代理; 5. document.domain 跨域; 6. window.name 跨域; 7. location.hash 跨域; 8. postMessage 跨域;
9.DOM Tree是如何构建的?
- 转码: 浏览器将接收到的二进制数据按照指定编码格式转化为HTML字符串
- 生成Tokens: 之后开始parser,浏览器会将HTML字符串解析成Tokens
- 构建Nodes: 对Node添加特定的属性,通过指针确定 Node 的父、子、兄弟关系和所属 treeScope
- 生成DOM Tree: 通过node包含的指针确定的关系构建出DOM
Tree
10.前端需要注意哪些seo(搜索引擎优化)?(拼多多 2019.11)
- 合理的title、description、keywords:搜索对着三项的权重逐个减小,title值强调重点即可,重要关键词出现不要超过2次,而且要靠前,不同页面title要有所不同;description把页面内容高度概括,长度合适,不可过分堆砌关键词,不同页面description有所不同;keywords列举出重要关键词即可
- 语义化的HTML代码,符合W3C规范:语义化代码让搜索引擎容易理解网页
- 重要内容HTML代码放在最前:搜索引擎抓取HTML顺序是从上到下,有的搜索引擎对抓取长度有限制,保证重要内容一定会被抓取
重要内容不要用js输出:爬虫不会执行js获取内容
- 少用iframe:搜索引擎不会抓取iframe中的内容
- 非装饰性图片必须加alt
- 提高网站速度:网站速度是搜索引擎排序的一个重要指标
11.什么是会话跟踪,有哪几种方法?(拼多多 2019.11)
- 对同一个用户对服务器的连续的请求和接受响应的监视。常用的方法有:
- URL重写 的技术就是在URL结尾添加一个附加数据以标识该会话,把会话ID通过URL的信息传递过去,以便在服务器端进行识别不同的用户 。
- 隐藏表单域 将会话ID添加到HTML表单元素中提交到服务器,此表单元素并不在客户端显示。
- Cookie Cookie是Web服务器发送给客户端的一小段信息,客户端请求时可以读取该信息发送到服务器端,进而进行用户的识别。对于客户端的每次请求,服务器都会将Cookie发送到客户端,在客户端可以进行保存,以便下次使用。
- session 每一个用户都有一个不同的session,各个用户之间是不能共享的,是每个用户所独享的,在session中可以存放信息。在服务器端会创建一个session对象,产生一个sessionID来标识这个session对象,然后将这个sessionID放入到Cookie中发送到客户端,下一次访问时,sessionID会发送到服务器,在服务器端进行识别不同的用户。
12.Doctype作用?严格模式与混杂模式如何区分?它们有何意义?(快手一面 2019.08)
- Doctype声明于文档最前面,告诉浏览器以何种方式来渲染页面,这里有两种模式,严格模式和混杂模式。
- 严格模式 的排版和JS 运作模式是 以该浏览器支持的最高标准运行。
- 混杂模式,向后兼容,模拟老式浏览器,防止浏览器无法兼容页面。
自动化工具
1. 什么是webpack,webpack的运行原理,如何打包 (字节跳动)
webpack是一个打包模块化javascript的工具,在webpack里一切文件皆模块,通过loader转换文件,通过plugin注入钩子,最后输出由多个模块组合成的文件,webpack专注构建模块化项目。
WebPack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等),并将其打包为合适的格式以供浏览器使用。
2、webpack如何配置?
参考 :https://www.webpackjs.com/configuration/
3. webpack与grunt、gulp的不同?(招行信用卡中心)
- Grunt、Gulp是基于任务运行的工具: 它们会自动执行指定的任务,就像流水线,把资源放上去然后通过不同插件进行加工,它们包含活跃的社区,丰富的插件,能方便的打造各种工作流。
- Webpack是基于模块化打包的工具: 自动化处理模块,webpack把一切当成模块,当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。
- 因此这是完全不同的两类工具,而现在主流的方式是用npm script代替Grunt、Gulp,npm script同样可以打造任务流。
4.什么是bundle,什么是chunk,什么是module?
5.什么是Loader?什么是Plugin?
1)Loaders是用来告诉webpack如何转化处理某一类型的文件,并且引入到打包出的文件中
2)Plugin是用来自定义webpack打包过程的方式,一个插件是含有apply方法的一个对象,通过这个方法可以参与到整个webpack打包的各个流程(生命周期)。
6. 有哪些常见的Loader?他们是解决什么问题的?
-
file-loader:把文件输出到一个文件夹中,在代码中通过相对 URL 去引用输出的文件
-
url-loader:和 file-loader 类似,但是能在文件很小的情况下以 base64 的方式把文件内容注入到代码中去
-
source-map-loader:加载额外的 Source Map 文件,以方便断点调试
-
image-loader:加载并且压缩图片文件
-
babel-loader:把 ES6 转换成 ES5
-
css-loader:加载 CSS,支持模块化、压缩、文件导入等特性
-
style-loader:把 CSS 代码注入到 JavaScript 中,通过 DOM 操作去加载 CSS。
-
eslint-loader:通过 ESLint 检查 JavaScript 代码
7. 有哪些常见的Plugin?
-
define-plugin:定义环境变量
-
html-webpack-plugin:简化html文件创建
-
uglifyjs-webpack-plugin:通过UglifyES压缩ES6代码
-
webpack-parallel-uglify-plugin: 多核压缩,提高压缩速度
-
webpack-bundle-analyzer: 可视化webpack输出文件的体积
-
mini-css-extract-plugin: CSS提取到单独的文件中,支持按需加载
8.webpack中loader和plugin的区别 (字节跳动 搜狐)
- Loader直译为"加载器"。Webpack将一切文件视为模块,但是webpack原生是只能解析js文件,如果想将其他文件也打包的话,就会用到loader。 所以Loader的作用是让webpack拥有了加载和解析_非JavaScript文件_的能力。
- Plugin直译为"插件"。Plugin可以扩展webpack的功能,让webpack具有更多的灵活性。 在 Webpack 运行的生命周期中会广播出许多事件,Plugin 可以监听这些事件,在合适的时机通过 Webpack 提供的 API 改变输出结果。
- Loader在module.rules中配置,也就是说他作为模块的解析规则而存在。 类型为数组,每一项都是一个Object,里面描述了对于什么类型的文件(test),使用什么加载(loader)和使用的参数(options)
- Plugin在plugins中单独配置。 类型为数组,每一项是一个plugin的实例,参数都通过构造函数传入。
9.webpack的构建流程是什么?从读取配置到输出文件这个过程尽量说全
Webpack 的运行流程是一个串行的过程,从启动到结束会依次执行以下流程:
-
初始化参数:从配置文件和 Shell 语句中读取与合并参数,得出最终的参数;
-
开始编译:用上一步得到的参数初始化 Compiler 对象,加载所有配置的插件,执行对象的 run 方法开始执行编译;
-
确定入口:根据配置中的 entry 找出所有的入口文件;
-
编译模块:从入口文件出发,调用所有配置的 Loader 对模块进行翻译,再找出该模块依赖的模块,再递归本步骤直到所有入口依赖的文件都经过了本步骤的处理;
-
完成模块编译:在经过第4步使用 Loader 翻译完所有模块后,得到了每个模块被翻译后的最终内容以及它们之间的依赖关系;
-
输出资源:根据入口和模块之间的依赖关系,组装成一个个包含多个模块的 Chunk,再把每个 Chunk 转换成一个单独的文件加入到输出列表,这步是可以修改输出内容的最后机会;
-
输出完成:在确定好输出内容后,根据配置确定输出的路径和文件名,把文件内容写入到文件系统。
10. webpack的plugins和loaders的实现原理? (达达京东到家 2019.04)
-
Loader像一个"翻译官"把读到的源文件内容转义成新的文件内容,并且每个Loader通过链式操作,将源文件一步步翻译成想要的样子。
-
编写Loader时要遵循单一原则,每个Loader只做一种"转义"工作。 每个Loader的拿到的是源文件内容(source),可以通过返回值的方式将处理后的内容输出,也可以调用this.callback()方法,将内容返回给webpack。 还可以通过 this.async()生成一个callback函数,再用这个callback将处理后的内容输出出去。 此外webpack还为开发者准备了开发loader的工具函数集——loader-utils。
-
相对于Loader而言,Plugin的编写就灵活了许多。webpack在运行的生命周期中会广播出许多事件,Plugin 可以监听这些事件,在合适的时机通过 Webpack 提供的 API 改变输出结果。
11.如何利用webpack来优化前端性能?(达达京东到家 2019.04)
-
压缩代码。删除多余的代码、注释、简化代码的写法等等方式。可以利用webpack的UglifyJsPlugin和ParallelUglifyPlugin来压缩JS文件, 利用cssnano(css-loader?minimize)来压缩css
-
利用CDN加速。在构建过程中,将引用的静态资源路径修改为CDN上对应的路径。可以利用webpack对于output参数和各loader的publicPath参数来修改资源路径
-
删除死代码(Tree Shaking)。将代码中永远不会走到的片段删除掉。可以通过在启动webpack时追加参数–optimize-minimize来实现
-
提取公共代码。
12. webpack、rollup、parcel优劣?
-
webpack适用于大型复杂的前端站点构建: webpack有强大的loader和插件生态,打包后的文件实际上就是一个立即执行函数,这个立即执行函数接收一个参数,这个参数是模块对象,键为各个模块的路径,值为模块内容。立即执行函数内部则处理模块之间的引用,执行模块等,这种情况更适合文件依赖复杂的应用开发.
-
rollup适用于基础库的打包,如vue、d3等: Rollup 就是将各个模块打包进一个文件中,并且通过 Tree-shaking 来删除无用的代码,可以最大程度上降低代码体积,但是rollup没有webpack如此多的的如代码分割、按需加载等高级功能,其更聚焦于库的打包,因此更适合库的开发.
-
parcel适用于简单的实验性项目: 他可以满足低门槛的快速看到效果,但是生态差、报错信息不够全面都是他的硬伤,除了一些玩具项目或者实验项目不建议使用
13. 如何提高webpack的打包速度?
-
happypack: 利用进程并行编译loader,利用缓存来使得 rebuild 更快,遗憾的是作者表示已经不会继续开发此项目,类似的替代者是thread-loader
-
外部扩展(externals): 将不怎么需要更新的第三方库脱离webpack打包,不被打入bundle中,从而减少打包时间,比如jQuery用script标签引入。
-
dll: 采用webpack的 DllPlugin 和 DllReferencePlugin 引入dll,让一些基本不会改动的代码先打包成静态资源,避免反复编译浪费时间
-
利用缓存: webpack.cache、babel-loader.cacheDirectory、HappyPack.cache都可以利用缓存提高rebuild效率
-
缩小文件搜索范围: 比如babel-loader插件,如果你的文件仅存在于src中,那么可以include: path.resolve(__dirname, ‘src’),当然绝大多数情况下这种操作的提升有限,除非不小心build了node_modules文件
14. 如何提高webpack的构建速度?(天壤智能)
-
多入口情况下,使用CommonsChunkPlugin来提取公共代码
-
通过externals配置来提取常用库
-
利用DllPlugin和DllReferencePlugin预编译资源模块 通过DllPlugin来对那些我们引用但是绝对不会修改的npm包来进行预编译,再通过4. DllReferencePlugin将预编译的模块加载进来。
-
使用Happypack 实现多线程加速编译
-
使用webpack-uglify-parallel来提升uglifyPlugin的压缩速度。 原理上webpack-uglify-parallel采用了多核并行压缩来提升压缩速度
-
使用Tree-shaking和Scope Hoisting来剔除多余代码
15. AMD和CMD的区别?
- 最明显的区别就是在模块定义时对依赖的处理不同
- AMD推崇依赖前置,在定义模块的时候就要声明其依赖的模块
- CMD推崇就近依赖,只有在用到某个模块的时候再去require
参考:前端模块化,AMD与CMD的区别
16. 介绍模块化发展历程
- 模块化主要是用来抽离公共代码,隔离作用域,避免变量冲突等。
- IIFE: 使用自执行函数来编写模块化,特点:在一个单独的函数作用域中执行代码,避免变量冲突。
- AMD: 使用requireJS 来编写模块化,特点:依赖必须提前声明好。
- CMD: 使用seaJS 来编写模块化,特点:支持动态引入依赖文件。
- CommonJS: nodejs 中自带的模块化。
- UMD:兼容AMD,CommonJS 模块化语法。
- webpack(require.ensure):webpack 2.x 版本中的代码分割。
- ES Modules: ES6 引入的模块化,支持import 来引入另一个 js 。
17.webpack 热更新原理
参考 :https://segmentfault.com/a/1190000016068450
服务端和网络
1.进程与线程的区别(字节跳动一面 2019.08)
-
地址空间:同一进程的线程共享本进程的地址空间,而进程之间是独立的地址空间。
-
资源拥有:同一进程内的线程共享本进程的资源如内存、I/O、cpu等,但是进程之间的资源是独立的。
-
一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都会死掉,所以多进程要比多线程健壮。
-
线程执行开销小,但是不利于资源的管理和保护。线程适合在SMP机器(双CPU系统)上运行。进程执行开销大,但是能够很好的进行资源管理和保护。进程可以跨机器前移。
-
对资源的管理和保护要求高,不限制开销和效率时,使用多进程。要求效率高,频繁切换时,资源的保护管理要求不是很高时,使用多线程。
2.什么是会话跟踪,有哪几种方法?(字节跳动 一面 2019.08)
- 对同一个用户对服务器的连续的请求和接受响应的监视。常用的方法有:
- URL重写 的技术就是在URL结尾添加一个附加数据以标识该会话,把会话ID通过URL的信息传递过去,以便在服务器端进行识别不同的用户 。
- 隐藏表单域 将会话ID添加到HTML表单元素中提交到服务器,此表单元素并不在客户端显示。
- Cookie Cookie是Web服务器发送给客户端的一小段信息,客户端请求时可以读取该信息发送到服务器端,进而进行用户的识别。对于客户端的每次请求,服务器都会将Cookie发送到客户端,在客户端可以进行保存,以便下次使用。
- session 每一个用户都有一个不同的session,各个用户之间是不能共享的,是每个用户所独享的,在session中可以存放信息。在服务器端会创建一个session对象,产生一个sessionID来标识这个session对象,然后将这个sessionID放入到Cookie中发送到客户端,下一次访问时,sessionID会发送到服务器,在服务器端进行识别不同的用户。
3.ssl加密使用了哪种算法,如何加密 (阿里巴巴 2019.08)
-
在客户端与服务器间传输的数据是通过使用对称算法(如 DES 或 RC4)进行加密的。
-
公用密钥算法(通常为 RSA)是用来获得加密密钥交换和数字签名的,此算法使用服务器的SSL数字证书中的公用密钥。
4.TCP三次握手的过程,为什么是三次而不是两次或者四次?(阿里巴巴 2019.08)
- 第一次握手:客户端A发送一个syn(同步)包(syn=x)给服务器B,进入SYN_SEND状态,等待服务器确认
- 第二次握手:服务端B收到客户端A发送的同步包,确认客户端的同步请求(ack=x+1),同时也发送一个同步包, 也就是一个ACK包+SYN包服务器进入SYN_RECV状态
- 第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送一个确认包,此包发送完毕,客户端和服务器进入 ESTABLISHED状态,完成三次握手
- 三次握手的原因是为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误
5.讲一下TCP的四次挥手(快手二面 2019.10)
-
第一次:主动关闭方发送一个FIN包,用来关闭主动关闭方到被动关闭方的数据传送,也就是告诉另一方我不再发送数据了,但此时仍可以接收数据
-
第二次:被动关闭方收到FIN包之后,发送一个确认(ACK)包给对方
-
第三次:被动关闭方发送一个FIN包,告诉对方不带发送数据
-
第四次:主动关闭方收到FIN包之后,发送一个ACK包给对方,至此完成四次挥手
6.用户登陆过程的简要说明,如何判断用户是否登录?(快手二面 2019.10)
- 用户输入用户名和密码,通过post请求将密码和用户名发送给服务器,服务器比对收到的用户名、密码和数据库中的数据进行比对,不一致则做出响应,反馈信息给客户端,如果比对一致则服务端生成一个session,这个session可以存储在内存、文件、数据库中,同时生成一个与之一一对应的sessionID作为cookie发送给客户端,比对成功之后反馈信息,这时一般会进行一次重定向,重定向至登陆之后的默认页面。判断用户登录则是根据这个sessionID,每次请求会先检查有没有这次类似sessionID的cookie发送过来,没有则认为没有登录,有则是否有相应的session,这个session是否过期等,来判断用户是否登录,登录是否过期。
7. Get和Post的区别 (字节跳动 一面 2019.08)
-
Get 请求能缓存,Post 不能
-
Post 相对 Get 安全一点点,因为 Get 请求都包含在 URL 里,且会被浏览器保存历史纪录。Post 不会,但是在抓包的情况下都是一样的。
-
URL有长度限制,会影响 Get 请求,但是这个长度限制是浏览器规定的,不是 RFC 规定的。
-
Post 可以通过 request body来传输比 Get 更多的数据,Get 没有这个技术。
-
Post 支持更多的编码类型且不对数据类型限制。
-
Get 多用于无副作用,幂等的场景,例如搜索关键字。Post 多用于副作用,不幂等的场景,例如注册。
-
备注:副作用指对服务器上的资源做改变,搜索是无副作用的,注册是副作用的。幂等指发送 M 和 N 次请求(两者不相同且都大于 1),服务器上资源的状态一致,比如注册 10 个和 11 个帐号是不幂等的,对文章进行更改 10 次和 11 次是幂等的。因为前者是多了一个账号(资源),后者只是更新同一个资源。
8.介绍一下DNS的查找过程?(网易互娱一面 2019.11)
递归查询
第一步:在hosts静态文件、DNS解析器缓存中查找某主机的ip地址
第二步:上一步无法找到,去DNS本地服务器(即域服务器)查找,其本质是去区域服务器、服务器缓存中查找
第三步:本地DNS服务器查不到就根据‘根提示文件’向负责顶级域‘.com’的DNS服务器查询
第四步:‘根DNS服务器’根据查询域名中的‘xyz.com’,再向xyz.com的区域服务器查询
第五步:DNS服务器直接解析该域名,将查询到的ip再原路返回给请求查询的主机
9. 强制缓存和协商缓存 (网易互娱一面 2019.11)
- 强制缓存: 浏览器在请求某一资源时,会先获取该资源缓存的header信息,判断是否命中强缓存(cache-control和expires信息),若命中直接从缓存中获取资源信息,包括缓存header信息;本次请求根本就不会与服务器进行通信;
- 协商缓存: 如果没有命中强缓存,浏览器会发送请求到服务器,请求会携带第一次请求返回的有关缓存的header字段信息(Last-Modified/If-Modified-Since和Etag/If-None-Match),由服务器根据请求中的相关header信息来比对结果是否协商缓存命中;若命中,则服务器返回新的响应header信息更新缓存中的对应header信息,但是并不返回资源内容,它会告知浏览器可以直接从缓存获取;否则返回最新的资源内容
- 关于缓存是从磁盘中获取还是从内存中获取,查找了很多资料,得出了一个较为可信的结论:Chrome会根据本地内存的使用率来决定缓存存放在哪,如果内存使用率很高,放在磁盘里面,内存的使用率很高会暂时放在内存里面。
10.写一个jsonp的实现 (搜狐一面 2019.12 )
- 利用了 script 标签没有跨域限制这一“漏洞”来达到与第三方通讯的目的。简单地说,该协议就是,允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名包裹json数据,这样客户端就可以随意定制自己的函数自动处理返回的数据了。
var flightHandler = data=>{
console.log(data);
}
var url = "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998&callback=flightHandler";
var script = document.createElement('script');
script.setAttribute('src', url);
document.getElementsByTagName('head')[0].appendChild(script);
结语
还有2件事拜托大家
一:求赞 求收藏 求分享 求留言,让更多的人看到这篇内容
二:欢迎添加我的个人微信
备注“资料”, 300多篇原创技术文章,海量的视频资料即可获得
备注“加群”,我会拉你进技术交流群,群里大牛学霸具在,哪怕您做个潜水鱼也会学到很多东西
相关链接
金三银四,磨砺锋芒;剑指大厂,扬帆起航(2020年最全大厂WEB前端面试题精选)下
金三银四,磨砺锋芒;剑指大厂,扬帆起航(2020年最全大厂WEB前端面试题精选)中
金三银四,磨砺锋芒;剑指大厂,扬帆起航(2020年最全大厂WEB前端面试题精选)上
参考资料
11道浏览器原理面试题
这儿有20道大厂面试题等你查收
2020 前端面试 | “HTML + CSS + JS”专题
图解浏览器的工作原理(史上最全)
BAT前端经典面试问题:史上最最最详细的手写Promise教程
webpack 中文网