2022高频经典前端面试题(es6+webpack+http网络+性能优化中篇,含答案)

news/2024/4/28 21:56:22/文章来源:https://blog.csdn.net/weixin_45822171/article/details/127532258

ES6篇

1. ES6的新特性?(必考)

参考阮一峰的es6文档:https://es6.ruanyifeng.com/

  • let、const
  • 变量的解构赋值
  • 模板字符串(可以直接进行变量拼接)
  • 箭头函数
  • … 展开运算符可以将数组或对象里面的值展开;还可以将多个值收集为一个变量
  • Symbol
  • Set 和Map(应用场景Set用于数据重组,Map用于数据储存)
  • Promise
  • Proxy代理使用代理(Proxy)监听对象的操作,然后可以做一些相应事情
  • For of
  • Async await (是es8引入的,是用来简化promise的异步操作)应用场景?

(讲几个自己熟悉的即可)

2.var let const区别(重点)

var定义变量,没有块的概念,可以跨块访问, 不能跨函数访问。存在变量提升;
let定义变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问。
const用来定义常量,使用时必须赋值,只能在块作用域里访问,而且不能修改。
const定义的常量不可改变,但是定义的应用类型的属性值是可以改变的,因为const仅保证指针不可改变就可以了。

3.map和set的区别

在这里插入图片描述

4.Map和object的区别?

在这里插入图片描述

5.对Promise的理解(重点)

Promise是异步编程的一种解决方案,所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
优点:他的出现大大改善了异步编程的困境,避免了地狱回调,它比传统的解决方案回调函数和事件更合理和更强大。

Promise的使用场景

解决回调地狱问题
其实Promise在实际的应用中往往起到代理的作用。例如我们发出请求调用服务器数据,由于网络延时原因,我们此时无法调用到数据,我们可以接着执行其它任务,等到将来某个时间节点服务器响应数据到达客户端,我们即可使用promise自带的一个回调函数来处理数据。

//写一个promise
var promise = new Promise(function(resolve, reject) {console.log('Promise instance'); 
resolve(); 
}); 
const p2 = new Promise(function (resolve, reject) {cosole.log('1秒之后,调用p1'); 
setTimeout(() => resolve(p1), 1000)})

Promise的API你有了解过吗?

参考阮一峰的es6文档:https://es6.ruanyifeng.com/

在你回答了关于Promise的API的一些常识之后,面试官会针对promise对你提一些针对化的提问。关于promise也有可能出一些笔试题。你需要重点掌握。

6.对async/await 的理解

async“异步”,async用于声明一个函数是异步的。
而await“等待”的意思,就是用于等待异步完成。
并且await只能在async函数中使用。
通常async、await都是跟随Promise一起使用的。因为async返回的都是一个Promise对象,同时async适用于任何类型的函数上。

async/await对比Promise的优势

• 代码读起来更加同步,Promise虽然摆脱了回调地狱,但是then的链式调⽤也会带来额外的阅读负担
• Promise传递中间值⾮常麻烦,⽽async/await⼏乎是同步的写法,⾮常优雅
• 错误处理友好,async/await可以⽤成熟的try/catch,Promise的错误捕获⾮常冗余
• 调试友好,Promise的调试很差,由于没有代码块,你不能在⼀个返回表达式的箭头函数中设置断点,如果你在⼀个.then代码块中使⽤调试器的步进(step-over)功能,调试器并不会进⼊后续的.then代码块,因为调试器只能跟踪同步代码的每⼀步。

7.export 与 export default的区别?

export与export default均可用于导出常量、函数、文件、模块等
在一个文件或模块中,export、import可以有多个,export default仅有一个
通过export方式导出,在导入时要加{ },export default则不需要,并可以起任意名称
(1) 输出单个值,使用export default
(2) 输出多个值,使用export
(3) export default与普通的export不要同时使用
8.事件扩展符用过吗(…),什么场景下?
常见的场景:等价于apply的方式、将数组展开为构造函数的参数、字面量数组或字符串连接不需要使用concat等方法了、构造字面量对象时,进行浅克隆或者属性拷贝 。

8.说说同源策略和跨域

跨域:两个url的协议、端口号、域名只有有一个不同都是跨域。
在这里插入图片描述

9.怎样解决跨域问题?(重点)

1.jsonp的原理
就是利用script标签没有跨域限制,通过script标签src属性,发送带有callback参数的GET请求,服务端将接口返回数据拼凑到callback函数中,返回给浏览器,浏览器解析执行,从而前端拿到callback函数返回的数据。
在这里插入图片描述

Webpack工程化篇

1. 是什么?

模块打包工具。

2. 做什么的?

它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(less,Sass,TypeScript等),并将其转换和打包为合适的格式供浏览器使用。
实际就是将浏览器不认识的语法编译成浏览器认识的语法。

3、webpack打包原理

把一切都视为模块:不管是 css、JS、Image 还是 html 都可以互相引用,通过定义 entry.js,对所有依赖的文件进行跟踪,将各个模块通过 loader 和 plugins 处理,然后打包在一起。
按需加载:打包过程中 Webpack 通过 Code Splitting 功能将文件分为多个 chunks,还可以将重复的部分单独提取出来作为 commonChunk,从而实现按需加载。把所有依赖打包成一个 bundle.js 文件,通过代码分割成单元片段并按需加载。

4、webpack的核心概念

Entry:入口,Webpack 执行构建的第一步将从 Entry 开始,可抽象成输入。告诉webpack要使用哪个模块作为构建项目的起点,默认为./src/index.js
output :出口,告诉webpack在哪里输出它打包好的代码以及如何命名,默认为./dist
Module:模块,在 Webpack 里一切皆模块,一个模块对应着一个文件。Webpack 会从配置的 Entry 开始递归找出所有依赖的模块。
Chunk:代码块,一个 Chunk 由多个模块组合而成,用于代码合并与分割。
Loader:模块转换器,用于把模块原内容按照需求转换成新内容。
Plugin:扩展插件,在 Webpack 构建流程中的特定时机会广播出对应的事件,插件可以监听这些事件的发生,在特定时机做对应的事情。

5、gulp/grunt 与 webpack的区别是什么?

三者都是前端构建工具,grunt和gulp在早期比较流行,现在webpack相对来说比较主流,不过一些轻量化的任务还是会用gulp来处理,比如单独打包CSS文件等。
grunt和gulp是基于任务和流(Task、Stream)的。
类似jQuery,找到一个(或一类)文件,对其做一系列链式操作,更新流上的数据, 整条链式操作构成了一个任务,多个任务就构成了整个web的构建流程。

webpack是基于入口的。webpack会自动地递归解析入口所需要加载的所有资源文件,然后用不同的Loader来处理不同的文件,用Plugin来扩展webpack功能。

6、前端为什么要进行打包和构建?

代码层面
体积更小(Tree-shaking、压缩、合并),加载更快
编译高级语言和语法(TS、ES6、模块化、scss)
兼容性和错误检查(polyfill,postcss,eslint)

研发流程层面:
统一、高效的开发环境
统一的构建流程和产出标准
集成公司构建规范(提测、上线)
webpack有哪些优点
专注于处理模块化的项目,能做到开箱即用,一步到位
可通过plugin扩展,完整好用又不失灵活
使用场景不局限于web开发
社区庞大活跃,经常引入紧跟时代发展的新特性,能为大多数场景找到已有的开源扩展
良好的开发体验
webpack的缺点
webpack的缺点是只能用于采用模块化开发的项目

7.Webpack的打包流程:

Webpack首先会把配置参数和命令行的参数及默认参数合并,
并初始化需要使用的插件和配置插件等执行环境所需要的参数;
初始化完成后会调用Compiler的run来真正启动webpack编译构建过程,
webpack的构建流程包括compile、make、build、seal、emit阶段,
执行完这些阶段就完成了构建过程。

8.分别介绍什么是loader?什么是plugin?

loader:模块转换器,用于将模块的原内容按照需要转成你想要的内容。
plugin:是用来自定义webpack打包过程的方式,扩展 Webpack 功能的,改变构建结果,它给 Webpack 带来了很大的灵活性。
通过plugins属性来配置需要使用的插件列表的。plugins属性是一个数组,里面的每一项都是插件的一个实例,在实例化一个组件时可以通过构造函数传入这个组件支持的配置属性。

常用loader

css-loader读取 合并CSS 文件
style-loader把 CSS 内容注入到 JavaScript 里
sass-loader 解析sass文件(安装sass-loader,node-sass)
postcss-loader自动添加浏览器兼容前缀(postcss.config配置)
url-loader将文件转换为base64 URI。
vue-loader处理vue文件。
image-loader:加载并且压缩图片文件
babel-loader:把 ES6 转换成 ES5
eslint-loader:通过 ESLint 检查 JavaScript 代码

几个常见的plugin

define-plugin:定义环境变量
terser-webpack-plugin:通过TerserPlugin压缩ES6代码
html-webpack-plugin 为html文件中引入的外部资源,可以生成创建html入口文件
mini-css-extract-plugin:分离css文件
clean-webpack-plugin:删除打包文件
happypack:实现多线程加速编译
如何提高webpack的构建速度
1.通过externals配置来提取常用库
2.利用DllPlugin和DllReferencePlugin预编译资源模块通过DllPlugin来对那些我们引用但是绝对不会修改的npm包来进行预编译,再通过DllReferencePlugin将预编译的模块加载进来。
3.使用Happypack 实现多线程加速编译
4.使用Tree-shaking和Scope Hoisting来剔除多余代码
5.使用webpack-uglify-paralle来提升uglifyPlugin的压缩速度。
6.使用fast-sass-loader代替sass-loader
7.babel-loader开启缓存

什么 是模块热更新?

模块热更新是webpack的一个功能,他可以使得代码修改过后不用刷新浏览器就可以更新。
在应用过程中替换添加删出模块,无需重新加载整个页面,是高级版的自动刷新浏览器。
优点:只更新变更内容,以节省宝贵的开发时间。调整样式更加快速,几乎相当于在浏览器中更改样式。


网络篇

1.get和post的区别?

在这里插入图片描述
幂等性是什么?
“幂等性:就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。”

2.http缓存方案有:

在这里插入图片描述

3.http和https的区别?(常考)

http由什么组成:一个请求报文由请求行、请求头、空行、实体(Get 请求没有)组成。
在这里插入图片描述

4.http1和http2的区别?(常考)

多路复用:一个tcp连接从单车道变成了几百个双向通行的车道。
在这里插入图片描述

5.http与Tcp的区别?

TCP协议是传输层协议,主要解决数据如何在网络中传输。
http协议是超文本传输协议,是应用层协议,http协议是建立在tcp协议之上的。http协议的特点是客户端发送请求都需要服务端回应,在请求结束后,会主动释放链接。从建立连接到关闭连接的过程称为‘一次连接’。

6.状态码(重点)

HTTP 状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型。
响应分为五类:信息响应(100–199),成功响应(200–299),重定向(300–399),客户端错误(400–499)和服务器错误 (500–599)。总共有45个。
在这里插入图片描述
在这里插入图片描述

8.介绍一下websocket。

1.是什么?
是HTML5的一种新的协议,Websocket是真正实现了全双工通信的服务器向客户端的互联网技术,是单个TCP连接上进行全双工通信协议。
2.HTTP与WebSocket区别?
http是短连接,请求之后会关闭连接。
WebSocket是长连接,只需通过一次请求初始化连接,然后所有的请求和响应都是通过这个TCP连接进行通信。
3.WebSocket特点?
与http协议有良好的兼容性
建立在TCP协议之上,与http同属于’应用层
数据量小、性能开销小、通信高效
可以发送文本和二进制
可以与任意服务器通信
握手阶段采用http协议,默认端口是80和443
协议标识字符ws、加密wss
服务器可以主动向客户端请求


前端性能优化篇

在这里插入图片描述

2.怎么解决浏览器的兼容性问题:

3.怎样解决移动端的适配问题(必问)

响应式布局(使用媒体查询来控制样式:在同一个css样式表中,根据不同的分辨率,写不同的css样式。800 1024 1280 1440 1600 1680 1920 )
百分比布局
flex布局
rem
vw vh
Js的方式(控制窗口的大小,缩放)
使用前端框架bootstrap

2. 页面怎样适配不同的浏览器和分辨率

1、在HTML头部增加viewport标签。增加viewport meta标签告诉浏览器视口宽度等于设备屏幕宽度,且不进行初始缩放。

2、在CSS文件尾部增加针对不同屏幕分辨率的规则。
@media screen and (max-device-width: 480px) {
#divMain{float: none;width:auto;}
#divSidebar {display:none;}
}
3、布局宽度使用相对宽度。
4、页面使用相对字体,16px就等于1em。


浏览器缓存篇

1.输入一个URL里面发生了什么?(必须知道)

  1. 浏览器通过DNS(全称 Domain Name System ,即域名系统。)查找该域名的 IP 地址
    2.浏览器根据解析得到的IP地址向 web 服务器发送一个 HTTP 请求
    3.服务器收到请求并进行处理
  2. 服务器返回一个响应
    5.浏览器对该响应进行解码,解析html为dom、解析CSS为CSS Rule Tree、
    dom+ css 生成render-tree 绘图
    6.页面显示完成后,浏览器发送异步请求。
    7.整个过程结束之后,浏览器关闭TCP连接。
    (浏览器–DNS–ip地址—http请求—服务器处理请求----返回响应)

2.Cookie LocalStorage SessionStorage Session 的区别 (重点)

Cookie V.S. LocalStorage
主要区别是 Cookie 会被发送到服务器,而 LocalStorage 不会;
Cookie 一般最大 4k,LocalStorage 可以有 5Mb 甚至 10Mb(各浏览器不同)

LocalStorage V.S. SessionStorage
LocalStorage 一般不会自动过期(除非用户手动清除),而 SessionStorage 在回话结束时过期(如关闭浏览器)

Cookie V.S. Session
Cookie 存在浏览器的文件里,Session 存在服务器的文件里
Session 是基于 Cookie 实现的,具体做法就是把 SessionID 存在 Cookie 里.

3.缓存有哪些?

数据库数据缓存,服务器端缓存,浏览器端缓存,web应用层缓存

4. 强缓存与协商缓存之间的区别?

强缓存:不经过服务器,直接从缓存中读取数据
协商缓存:向服务器发送请求,由服务器决定是从缓存中读取数据,还是由服务器返回新的数据

5.对浏览器的缓存机制的理解(重点)

浏览器缓存的全过程:
• 浏览器第一次加载资源,服务器返回 200,浏览器从服务器下载资源文件,并缓存资源文件与 response header,以供下次加载时对比使用;
• 下一次加载资源时,由于强制缓存优先级较高,先比较当前时间与上一返回 200 时的时间差,如果没有超过 cache-control 设置的 max-age,则没有过期,并命中强缓存,直接从本地读取资源。
• 如果浏览器不支持HTTP1.1,则使用 expires 头判断是否过期;
• 如果资源已过期,则表明强制缓存没有被命中,则开始协商缓存,向服务器发送带有 If-None-Match 和 If-Modified-Since 的请求;
• 服务器收到请求后,优先根据 Etag 的值判断被请求的文件有没有做修改,Etag 值一致则没有修改,命中协商缓存,返回 304;如果不一致则有改动,直接返回新的资源文件带上新的 Etag 值并返回 200;

6.对eventLoop机制的理解?(重点)

浏览器中的事件循环机制
在这里插入图片描述

答:执行宏任务,然后执行该宏任务产生的微任务,若微任务在执行过程中产生了新的微任务,则继续执行微任务,微任务执行完毕后,再回到宏任务中进行下一轮循环。

宏任务和微任务分别有哪些
• 微任务包括: promise 的回调、node 中的 process.nextTick 、
Async/Await(实际就是promise)
对 Dom 变化监听的 MutationObserver。(html5新特性)
• 宏任务包括: script 脚本的执行、setTimeout ,setInterval ,setImmediate 一类的定时事件,还有如 I/O 操作、UI 渲染等。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_410462.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试被问到如何排查JVM问题的,如何回答?

一、首先说可用工具 1、jmap可以查看当前Java进程的内存占用,把内存快照dump出来 用法:jmap [option] <pid> 常用命令jmap -heap pid 主要显示堆的内存使用情况,包括分代情况,每个代的总容量、已使用内存、可使用内存,如图: jmap -dump:live,format=b,file=xxx…

发第一篇SCI有哪些技巧?

正所谓万事开头难&#xff0c;每当第一次做某一件事情总是难以开展的。因为那时我们没有一定的方法和技巧去完成这些事。比如 SCI论文是无数科研人员认可的学术文献&#xff0c;但是想要在SCI期刊上发表论文是十分困难的&#xff0c;因为在论文创作上尚且不成熟&#xff0c;没有…

大学毕业1年,从监工转行软件测试,我拿到了人生第一份8k的offer

大家好&#xff0c;我是小静&#xff0c;是一名IT转行人&#xff0c;2015年毕业于某所XXXX大专&#xff0c;大学学的专业是土木工程&#xff0c;毕业也是不出意外的来到了工地&#xff0c;从事的是一份监工的工作&#xff0c;就是工地上带白帽子的&#xff0c;每个月拿着4000块…

js 之reduce 方法实现数组去重原理分布解析

需求 &#xff1a;当有一个数组对象 我们需要根据数组对象的某个属性进行去重 此时我们用reduce最合适不过 let alin [{id : 001 ,name : 小红},{id : 002 ,name : 小黄},{id : 001 ,name : 小红},]function arrRemoveRepet(arr) {let newArr []; // 去重后得到的新数组con…

生成新冠疫苗接种趋势图-技术和法律学习

生成新冠疫苗接种趋势图-技术和法律学习文档说明:只记录关键地方; 缘由:想看疫苗接种趋势图,我要去哪里找呢?奈何公开的渠道没有找到!自己做一个呗数据来源: http://www.nhc.gov.cn/xcs/xxgzbd/gzbd_index.shtml (信息来自国家卫生健康委员会官方网站) 我要怎么得到数据呢…

靶机20 driftingblues3

描述: __________ 获取标志 难度&#xff1a;简单 1、下载靶场 靶机名称&#xff1a;driftingblues 下载地址&#xff1a; DriftingBlues: 3 ~ VulnHub 2、安装靶场 以DC-1为例&#xff0c;将文件解压&#xff08;一压缩包形式进行下载&#xff09;。 打开虚拟机&#xff0c;选…

K8S二进制部署之定义CA证书与ETCD

文章目录CA证书制作K8S集群证书流程K8S 二进制集群部署K8S二进制部署ETCD集群部署1、docker部署&#xff08;所有节点&#xff09;ETCD集群部署master节点操作小结&#xff1a;查看etcd 启动脚本创建ca证书创建cfssl类型工具下载脚本到node节点修改CA证书 CA证书中包含密钥对 …

浅谈 web3

web3——互联网的未来? web3,很多人觉得是个骗局,是在割韭菜。因为大部分介绍 web3 的文章都离不开 NFT、数字货币、区块链、比特币、以太坊、元宇宙等概念,玄之又玄,脱离我们的生活,没解决我们的痛点。一般文章最后还教给我们怎么炒币,怎么买卖 NFT,妥妥的割韭菜套路,…

顺序结构综合练习

顺序结构综合练习 数学头文件#include<cmath> 幂函数 pow10(x)结果等于10^x pow()函数是cmath标头的库函数,用于查找幂的加数。计算x的y次方 pow()函数语法:pow(x,y); #include<cstdio>// main(){int a,b,c;scanf("%d%d",&a,&b);//格式化…

长时间久坐危害竟然这么大,这4项检查,男性朋友一定要定期查

对于男性而言&#xff0c;生殖系统健康尤为重要&#xff0c;但很多人却并不是那么重视&#xff0c;家住昆山的小王就是其中一员&#xff0c;作为一名程序员的他&#xff0c;上班坐着&#xff0c;上班路上坐着&#xff0c;下班路上也是坐着&#xff0c;回家更是坐着。小伙身体棒…

Bootstrap概述和Bootstrap快速入门

Bootstrap概述 1.概念:一个前端开发的框架,Bootstrap,来自Twitter,是目前很受欢迎的前端框架。Bootstrap是基于HTML、CSS、JavaScript的,它简洁灵活,使用得Web开发更加快捷。框架:一个半成品软件,开发人员可以在框架基础上,在进行开发,简化编码。好处:1.定义了很多的…

css 居中

阅读目录水平居中垂直居中垂直居中: position 绝对定位演示垂直居中: flex 演示垂直居中: transform 演示水平&垂直居中flex 1flex 2position水平居中 1 行内块居中 设置父元素的 text-align: center 2 块级元素 设置当前块级元素(宽度) margin: 0 auto; 3 绝对定位 元素…

【微机接口】中断的基本概念

中断&#xff1a; CPU在执行程序的过程中&#xff0c;由于某种外部或内部事件的作用&#xff0c;使CPU停止当前正在执行的程序转去为该事件服务&#xff0c;待事件服务结束后&#xff0c;又能自动返回到被中止的程序继续执行。 主程序&#xff1a; 被中断的原程…

@DateTimeFormat和@JsonFormat介绍

文章目录1.DateTimeFormat注解1.1DateTimeFormat注解简介1.2DateTimeFormat注解的功能1.3DateTimeFormat注解的注意点1.4DateTimeFormat功能演示1.4.1类型转换异常情况测试1.4.2接收url路径传参格式测试1.4.3接收Form-Data数据格式测试1.4.4接收JSON数据格式测试2.JsonFormat注…

基于协同过滤推荐算法的在线教育平台(Vue+Node.js+SSM)

基于协同过滤推荐算法的在线教育平台&#xff08;前后端分离&#xff09;。 back为后端&#xff0c;front为前端&#xff0c;config-files为相关配置文件 摘要 随着科技的不断变迁&#xff0c;信息技术的不断迭代升级。人们对于互联网方方面面的需求都开始涌现了出来&#xf…

第9章实验作业

实验9:异常处理及程序调试 一、实验目的和要求 1、了解代码异常知识; 2、掌握异常处理的try…except语句、try…except…else语句、try…except…finally语句。raise语句; 3、掌握程序调试的方法。 二、实验环境 软件版本:Python 3.10 64_bit 三,实验过程 实验1 (1) def…

实战经验:如何根据系统的业务场景需求定制自己的线程池?

线程池有那么多的参数和类型&#xff0c;在实际的开发中&#xff0c;我们应该如何设置呢&#xff1f;是直接使用Executors提供的线程池实现&#xff0c;还是自定义线程池&#xff1f;这都是我们本篇文章要回答的问题&#xff0c;那么就请跟随笔者一起分析一下在实战中如何根据系…

uniapp开发微信小程序-用户授权登录和获取手机号码

小程序开放文档 uniapp开发的小程序配置&#xff0c;找到manifest.json&#xff0c;填入正确的小程序appId&#xff1b; hbuilderx>运行>运行到小程序模拟器(安装开发者工具)&#xff0c;编译完成之后会直接在微信开发者工具内打开&#xff1b; 登录流程解析&#xff1…

【SpringBoot】一文了解SpringBoot热部署

文章目录前言手动启动热部署热部署种类手动进行热部署自动启动热部署热部署范围配置热部署的关闭总结&#x1f315;博客x主页&#xff1a;己不由心王道长&#x1f315;! &#x1f30e;文章说明&#xff1a;一文彻底搞懂SpringBoot热部署&#x1f30e; ✅系列专栏&#xff1a;Sp…

程序人生:去了字节跳动,才知道年薪40W的测试有这么多?

今年大环境不好&#xff0c;内卷的厉害&#xff0c;薪资待遇好的工作机会更是难得。最近脉脉职言区有一条讨论火了&#xff1a; 哪家互联网公司薪资最‘厉害’&#xff1f; 下面的评论多为字节跳动&#xff0c;还炸出了很多年薪40W的测试工程师 我只想问一句&#xff0c;现在的…