前端相关面试总结

目录

         CSS面试题

1.盒模型

2.如何让一个盒子水平垂直居中?

3.为什么要用flex布局,align-items和justify-content的区别

4.BFC(Block Formatting Context) 是什么?应用?

5.请描述一下 cookies,sessionStorage 和 localStorage 的区别?

6.px和em,rem的区别

7.解释下浮动和它的工作原理,清除浮动的方法?

8.如何实现浏览器内多个标签页之间的通信?

9.CSS隐藏元素的几种方法

10.css 优先级确定

11.简述下CSS的元素分类

12.重绘和回流

13、css3中transform、transition、animation的区别

14.link与@import 导入 css的区别

JavaScript基础面试题

1.js有哪些数据类型

2.栈和堆的区别?

2.Javascript实现继承的几种方式?

3.Javascript创建对象的几种方式?

4.Javascript作用链域

5.什么是闭包(closure),为什么要用它?

6.javascript 代码中的"use strict";是什么意思 ? 使用它区别是什么?

7.深拷贝和浅拷贝

8.JS延迟加载的方式有哪些?

9.什么是跨域问题 ,如何解决跨域问题?

11.DOM操作

12.什么是Cookie 隔离?

16.箭头函数和普通函数的区别

17. typeof  和 instanceof 的区别

Vue框架面试题

1.对于MVVM的理解?

2.Vue的生命周期

3.Vue实现数据双向绑定的原理

4.vue路由的钩子函数

5.for in和for of的区别 

6.v-if 和 v-show 有什么区别?

7.对于Vue是一套渐进式框架的理解(此为vue的核心)

8.Vue 组件间通信有哪几种方式?

9.怎么定义vue-router的动态路由?怎么获取传过来的值?

10.vue-router的路由模式有哪些?

11.vue-router有哪几种路由守卫?

12.vuex有哪几种属性?

13.vue中常用修饰符

14.vue等单页面应用及其优缺点

浏览器面试题

1.页面刷新不出来,可能是有哪些方面问题

3.浏览器下事件循环(Event Loop)

8.GC垃圾回收机制

服务端与网络

1.http/https 协议

2.常见状态码

3.get/ post

4.Websocket

5.TCP 三次握手

6.TCP 四次挥手

7.Node 的 Event Loop: 6 个阶段

10.HTTP和HTTP2的区别

Webpack 相关

算法

CSS面试题

1.盒模型

盒模型有标准盒模型(W3C)和IE的盒模型:
1、一个元素占有空间的大小由几个部分构成,其中包括元素的内容(content),元素的内边距(padding),内容与边框之间的距离元素的边框(border),元素的外边距(margin),边框与外部元素之间的距离四个部分,这四个部分一起构成了盒子模型。
2、区别:标准盒模型的内容大小是content的大小,而IE的则是content + padding +border 总的大小

2.如何让一个盒子水平垂直居中?

1、绝对定位,父相子绝,子元素:left:50%,top:50%,transform:translateX(-50%) translateY(-50%)
2、绝对定位,父相子绝,子元素:left:0,right:0,top:0,bottom:0,margin:auto
3、flex布局,父元素:display:flex,aligin-items:center,justify-content:center

3.为什么要用flex布局,align-items和justify-content的区别

1、传统布局基于盒模型,非常依赖 display属性 、position属性 、float属性。而flex布局更灵活,可以简便、完整、响应式地实现各种页面布局,比如水平垂直居中。
2、align-items:定义在侧轴(纵轴)方向上的对齐方式;
3、justify-content:定义在主轴(横轴)方向上的对齐方式。

4.BFC(Block Formatting Context) 是什么?应用?

1、BFC块级格式上下文,属于定位方案中的普通流。
具有BFC特性的元素可以看作是隔了的独立容器,容器里的元素不会在布局上影响到外面的元素。简单的说:可以理解BFC是要给封闭的大箱子,箱子内的元素无论如何交换,都不会影响到外面的元素。
2、触发条件:
①body根元素;
②浮动元素float的值不为none;
③绝对定位元素:positon(absolute、fixed);
④display的值为:display(block、inline-block、inltable-cell、table-caption、table、inline-table、flex、inline-flex、grid、inline-grid);
⑤overflow:除了visible以外的值;(hidden、scroll、auto);
3、应用场景:
①防止margin重叠;②清除内部浮动;③自适应多栏布局

5.请描述一下 cookies,sessionStorage 和 localStorage 的区别?

1、相同点:都会在浏览器端保存,有大小和同源限制。

2、不同点:
①cookie会随请求发送到服务器,作为会话表示,服务器可修改cookie。web storage不会随请求发送到服务器。
②cookie有path的概念,子路径可以访问父路径的cookie,父路径不可以访问子路径的cookie。
③有效期:cookie在设置的有效期内有效,默认为浏览器关闭消失。sessionStorage在会话窗口关闭后失效,localStorage长期有效,需主动删除。
④sessionStorage不能共享,localStorage在同源文档之间可以共享,cookie在同源且符合path规则的文档之间可以共享。
⑤localStorage的修改会触发其他文档的update事件。
⑥cooie有secure属性要求HTTPS传输。
⑦浏览器不能保存超过300个cookie,单个服务器不能超过20个,每个cookie不能超过4k。webStorage可以支持5M的存储。

6.px和em,rem的区别

1、em的值并不是固定的;em会继承父级元素的字体大小。

2、任意浏览器的默认字体高都是16px。所有未经调整的浏览器都符合: 1em=16px。那么12px=0.75em,10px=0.625em。为了简化font-size的换算,需要在css中的body选择器中声明Font-size=62.5%,这就使em值变为 16px*62.5%=10px, 这样12px=1.2em, 10px=1em, 也就是说只需要将你的原来的px数值除以10,然后换上em作为单位就行了

3、使用rem为元素设定字体大小时,仍然是相对大小,但相对的只是HTML根元素。这个单位可谓集相对大小和绝对大小的优点于一身,通过它既可以做到只修改根元素就成比例地调整所有字体大小,又可以避免字体大小逐层复合的连锁反应。目前,除了IE8及更早版本外,所有浏览器均已支持rem。对于不支持它的浏览器,应对方法也很简单,就是多写一个绝对单位的声明。这些浏览器会忽略用rem设定的字体大小。

7.解释下浮动和它的工作原理,清除浮动的方法?

1、浮动(float)也是大家平常在网页开发中经常使用的属性,(主要是为了让一些标签并排显示)
2、浮动元素脱离文档流,不占据空间。浮动元素碰到包含它的边框或者浮动元素的边框停留。
3、使用空标签清除浮动。给包含浮动元素的父标签添加overflow属性。使用after伪对象清除浮动(该方法只适用于非IE浏览器。使用中需注意以下几点。一、该方法中必须为需要清除浮动元素的伪对象中设置 height:0,否则该元素会比实际高出若干像素;)。

8.如何实现浏览器内多个标签页之间的通信?

1、使用本地存储器localStorage
使用localStorage.setItem(key,value);添加内容
使用storage事件监听添加、修改、删除的动作
2、使用cookie+setInterval

9.CSS隐藏元素的几种方法

1、opacity:0; 占位
2、visibility:hidden;占位
3、display:none;不占位
4、height:0;overflow:hidden; 不占位
5、position:absolute;left:-9999px;top:-9999px.;

10.css 优先级确定

1、最近的祖先样式比其他祖先样式优先级高。
2、"直接样式"比"祖先样式"优先级高。
3、内联样式 > ID 选择器 > 类选择器 = 属性选择器 = 伪类选择器 > 标签选择器 = 伪元素选择器
4、计算选择符中 ID 选择器的个数(a),计算选择符中类选择器、属性选择器以及伪类选择器的个数之和(b),计算选择符中标签选择器和伪元素选择器的个数
之和(c)。按 a、b、c 的顺序依次比较大小,大的则优先级高,相等则比较下一个。若最后两个的选择符中 a、b、c 都相等,则按照"就近原则"来判断。
5、属性后插有 !important 的属性拥有最高优先级。若同时插有 !important,则再利用规则 3、4 判断优先级。

11.简述下CSS的元素分类

1、替换和不可替换元素
2、块级元素和行内元素

12.重绘和回流

重绘:不会影响页面布局的操作,比如更改颜色。
回流:布局的改变导致需要重新构建,就是回流。

13、css3中transform、transition、animation的区别

1、transform:描述了元素的静态样式,本身不会呈现动画效果,可以对元素进行 旋转rotate、扭曲skew、缩放scale和移动translate以及矩阵变形matrix。transition和animation两者都能实现动画效果 transform常常配合transition和animation使用

2、transition样式过渡,从一种效果逐渐改变为另一种效果
transition:transition-property transition-duration transition-timing-function transition-delay 从左到右分别是:css属性、过渡效果花费时间、速度曲线、过渡开始的延迟时间
①transform仅描述元素的静态样式,常常配合transition和animation使用。
②transition通常和hover等事件配合使用,animation是自发的,立即播放。
③animation可设置循环次数 。
④animation可设置每一帧的样式和时间,transition只能设置头尾。
⑤transition可与js配合使用,js设定要变化的样式,transition负责动画效果,如:animation属性类似于transition,他们都是随着时间改变元素的属性值,其主要区别在于:transition需要触发一个事件才会随着时间改变其CSS属性;
animation在不需要触发任何事件的情况下,也可以显式的随时间变化来改变元素CSS属性,达到一种动画的效果
1)动画不需要事件触发,过渡需要。
2)过渡只有一组(两个:开始-结束) 关键帧,动画可以设置多个。

3、animation属性类似于transition,他们都是随着时间改变元素的属性值。

14.link与@import 导入 css的区别

1、link属于XHTML标签,除了加载CSS外,还能用于定义RSS, 定义rel连接属性等作用;而@import是CSS提供的,只能用于加载CSS;

2、页面被加载的时,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载; import是CSS2.1 提出的,只在IE5以上才能被识别,而link是XHTML标签,无兼容问题;


JavaScript基础面试题

1.js有哪些数据类型

1、基本数据类型有7种:String、Number、Boolean、Undefined、Null、Symbol、Bigint
2、引用数据类型 Object(Data、Function、Array等)

2.栈和堆的区别?

①堆是应用程序在运行时候请求操作系统分配给自己的内存。
②栈中一般存放局部变量,队中一般存放创建的对象和数组。

2.Javascript实现继承的几种方式?

1、原型链继承

3.Javascript创建对象的几种方式?

//第一种:字面量(语法糖)
const user1={
     name:'xiaoming'
   }
//第二种:new Object()和第二种基本一样
const user2=new Object({name:'xiaoming'})
//第三种:通过构造函数
const User=function (name) {
    this.name=nme;
  }
const user3=new User('xiaoming')
//第四种:Object.create()
const user ={name:'xiaoming'}
const user4=Object.create(user)

//第五种:通过es6方式,也就是工厂模式(其实也是构造方式)
class User{
    constructor(name){
        this.name=name
        this.getName = function(){
            return "姓名是" + this.name
        }
    }
}
let user4 = new User('xiaoming') 
console.log(user4)
//{name: 'xiaoming', getName: ƒ}

4.Javascript作用链域

5.什么是闭包(closure),为什么要用它?

1、闭包就是能够读取其他函数内部变量的函数、定义在一个函数内部的函数。

6.javascript 代码中的"use strict";是什么意思 ? 使用它区别是什么?

将”use strict”放在脚本文件的第一行,则整个脚本都将以”严格模式”运行。
1、消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
2、消除代码运行的一些不安全之处,保证代码运行的安全;
3、提高编译器效率,增加运行速度;

7.深拷贝和浅拷贝

前端中的深拷贝和浅拷贝及相应注意事项_沈行的博客-CSDN博客

8.JS延迟加载的方式有哪些?

1、defer 属性
2、async 属性
3、动态创建DOM方式
4、使用jQuery的getScript方法
5、使用setTimeout延迟方法
6、让JS最后加载

9.什么是跨域问题 ,如何解决跨域问题?

1、Jsonp:网页通过动态添加一个 script 元素,向服务器请求数据; 服务器收到请求后,将数据放在一个指定名字的回调函数里传回来。但只支持get请求。

2、设置跨域资源共享(CORS),不过需要浏览器和服务器同时支持,设置4项:
①允许请求带有验证信息
②允许访问的客户端域名
③允许服务端访问的客户端请求头
④允许访问的方法名,GET POST等

3、document.domain: 此方案仅限主域相同,子域不同的跨域应用场景

4、webpack配置proxyTable设置开发环境跨域

5、nginx反向代理
跨域原理: 同源策略是浏览器的安全策略,不是HTTP协议的一部分。服务器端调用HTTP接口只是使用HTTP协议,不会执行JS脚本,不需要同源策略,也就不存在跨越问题。
实现思路:通过nginx配置一个代理服务器(域名与domain1相同,端口不同)做跳板机,反向代理访问domain2接口,并且可以顺便修改cookie中domain信息,方便当前域cookie写入,实现跨域登录。

6、iframe跨域

7、postMessage:这种方式通常用于获取嵌入页面中的第三方页面数据。一个页面发送消息,另一个页面判断来源并接收消息

11.DOM操作

js是由三部分组成,分别为js 的语法核心 ECMAScript,还有文档对象模型 DOM,以及浏览器对象模型 BOM。

1、创建新节点

createDocumentFragment() // 创建一个DOM片段
createElement() // 创建一个具体的元素
createTextNode() // 创建一个文本节点

2、添加、移除、替换、插入

appendChild()
removeChild()
replaceChild()
insertBefore() // 在已有的子节点前插入一个新的子节点

3、查找

getElementsByTagName() // 通过标签名称
// 通过元素的Name属性的值(IE容错能力较强,会得到一个数组,其中包括id等于name值的)
getElementsByName() 
getElementById() // 通过元素Id,唯一性

12.什么是Cookie 隔离?

或者说:请求资源的时候不要让它带cookie怎么做

1、如果静态文件都放在主域名下,那静态文件请求的时候都带有的cookie的数据提交给server的,非常浪费流量,所以不如隔离开。
2、因为cookie有域的限制,因此不能跨域提交请求,故使用非主要域名的时候,请求头中就不会带有cookie数据,这样可以降低请求头的大小,降低请求时间,从而达到降低整体请求延时的目的。
同时这种方式不会将cookie传入Web Server,也减少了Web Server对cookie的处理分析环节,提高了webserver的http请求的解析速度。

16.箭头函数和普通函数的区别

1、箭头函数相当于匿名函数,并且简化了函数定义,不能作为构造函数,不能使用new这种方式。
2、箭头函数不绑定arguments,取而代之用rest参数...解决。
3、箭头函数不绑定this,会捕获其所在的上下文的this值,作为自己的this值。
4、箭头函数通过 call() 或 apply() 方法调用一个函数时,只传入了一个参数,对 this 并没有影响。
5、箭头函数没有原型属性。
6、箭头函数不能当做Generator函数,不能使用yield关键字。

17. typeof  和 instanceof 的区别

1、typeof是用于判断数据类型,返回值为6个字符串,分别为string、boolean、number、function、object、undefined

2、typeof在判断nullarrayobject 以及 函数实例(new + 函数)时,得到的都是object。这使得在判断这几类数据类型时,得不到真实的数据类型。

3、instanceof中文翻译为实例,因此instanceof的含义也就不言而喻,判断该对象是谁的实例,instance是属于对象运算符。

4、instanceof判断实例牵扯到对象的继承,它的判断是根据原型链进行搜寻,在对象obj1的原型链上如果存在另一个对象obj2的原型属性,那么表达式(obj1 instanceof obj2)返回值为true,否则返回false。


Vue框架面试题

1.对于MVVM的理解?

1、模型(Model): 数据保存—存放着各种数据,有的是固定写死的,大多数是从后端返回的数据。
2、视图 (View):用户界面,也就是DOM。
3、视图模型(View-Model):连接View和Model的桥梁,当数据变化时,ViewModel够监听到数据的变化(通过Data Bindings),自动更新视图,而当用户操作视图,ViewModel也能监听到视图的变化(通过DOM Listeners),然后通知数据做改动,这就实现了数据的双向绑定。

2.Vue的生命周期

常用的主要有8个:beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy、destroyed

3.Vue实现数据双向绑定的原理

数据发生变化,页面会重新渲染,数据的vue响应式

1、侦测数据的变化 -----------》数据劫持/数据代理(使Object.defineProperty和ES6的Proxy)

2、收集视图看下哪些依赖于这些有变化的数据 -----------》依赖收集(watcher,在getter中收集依赖,在setter中触发依赖)

3、数据变化时,自动通知需要更新的视图部分,并进行更新 -----------》发布订阅模式(update更新视图)

4.vue路由的钩子函数

1、全局钩子:beforeEach函数有三个参数:
to:router即将进入的路由对象
from:当前导航即将离开的路由
next:Function,进行管道中的一个钩子,如果执行完了,则导航的状态就是 confirmed (确认的);否则为false,终止导航。
afterEach函数不用传next()函数
这类钩子主要作用于全局,一般用来判断权限,以及以及页面丢失时候需要执行的操作。

例如//使用钩子函数对路由进行权限跳转

2、单个路由里面的钩子
主要用于写某个指定路由跳转时需要执行的逻辑。

3、组件路由

主要包括 beforeRouteEnter和beforeRouteUpdate ,beforeRouteLeave,这几个钩子都是写在组件里面也可以传三个参数(to,from,next),作用与前面类似.

5.for in和for of的区别 

for in是ES5标准,遍历得到的是key,更适合遍历对象。
for of是ES6引入,遍历value,更适合遍历数组。

6.v-if 和 v-show 有什么区别?

1、v-if本质是向Dom树内添加或者删除Dom元素,v-show类似于display:none
2、如果频繁切换就用v-show,不频繁切换就用v-if

7.对于Vue是一套渐进式框架的理解(此为vue的核心)

Vue渐进式-先使用Vue的核心库,再根据你的需要的功能再去逐渐增加加相应的插件。

1、数据驱动专注于View 层。它让开发者省去了操作DOM的过程,只需要改变数据。
2、组件响应原理数据(model)改变驱动视图(view)自动更新
3、组件化扩展HTML元素,封装可重用的代码。

8.Vue 组件间通信有哪几种方式?

1、props / $emit()
2、provide / inject   祖孙组件传值,注意:传递参数为值类型(基本类型),接受参数的组件中不能进行修改,若是传递对象或者数组,可以直接进行修改,并且可以影响祖先级组件。
3、vuex
4、$parent / $children & ref
5、$emit / $on
6、$attrs / $listeners 

9.怎么定义vue-router的动态路由?怎么获取传过来的值?

params刷新会消失。。。query则不会

1、params的类型(参数刷新会消失,另相当于post请求)

2、query的类型(刷新参数不会消失,另相当于get请求,参数在地址栏显示)

10.vue-router的路由模式有哪些?

vue-router 有 3 种路由模式:hash、history、abstract:

1、hash: 原理: 在 url 中的 # 之后对应的是 hash 值, 其原理是通过hashChange() 事件监听hash值的变化, 根据路由表对应的hash值来判断加载对应的路由加载对应的组件。支持所有浏览器,包括不支持 HTML5 History Api 的浏览器;
2、history : 依赖 HTML5 History API 和服务器配置。具体可以查看 HTML5 History 模式;
3、abstract : 支持所有 JavaScript 运行环境,如 Node.js 服务器端。如果发现没有浏览器的 API,路由会自动强制进入这个模式;

11.vue-router有哪几种路由守卫?

1、全局前置守卫beforeEach

2、全局后置路由守卫afterEach

3、全局解析守卫beforeResolve

4、路由独享守卫beforeEnter

5、组件内的守卫beforeRouteXXX(beforeRouteEnter)

12.vuex有哪几种属性?

1、state:vuex的基本数据,用来存储变量(后四个属性都是用来操作state里面储存的变量的)。
2、getters:是对state里面的变量进行过滤的。
3、mutation:提交更新数据的方法,必须是同步的(如果需要异步使用action)。
4、action:和mutation的功能大致相同,不同之处在于:
            1.Action提交的是mutation,而不是直接变更状态。  也就是action是用来修改mutation并提交的,而mutation是通过修改state
             2.Action可以包含任意异步操作。(一般比较复杂的数据都在action中操作)
             3.action先会执行异步操作再去调用mutation,随后才跟新state
5、modules:项目特别复杂的时候,可以让每一个模块拥有自己的state、mutation、action、getters,使得结构非常清晰,方便管理。

13.vue中常用修饰符

1、v-model修饰符
①.lazy:
输入框改变,这个数据就会改变,lazy这个修饰符会在光标离开input框才会更新数据: 

<input type="text" v-model.lazy="value">

②.trim:
输入框过滤首尾的空格: 

<input type="text" v-model.trim="value">

③.number:
先输入数字就会限制输入只能是数字,先字符串就相当于没有加number,注意,不是输入框不能输入字符串,是这个数据是数字:

<input type="text" v-model.number="value">

2、事件修饰符
④.stop:
阻止事件冒泡,相当于调用了event.stopPropagation()方法:

<button @click.stop="test">test</button>

⑤.prevent:
阻止默认行为,相当于调用了event.preventDefault()方法,比如表单的提交、a标签的跳转就是默认事件:

<a @click.prevent="test">test</a>

⑥.self:
只有元素本身触发时才触发方法,就是只有点击元素本身才会触发。比如一个div里面有个按钮,div和按钮都有事件,我们点击按钮,div绑定的方法也会触发,如果div的click加上self,只有点击到div的时候才会触发,变相的算是阻止冒泡:

<div @click.self="test"></div>

⑦.once:
事件只能用一次,无论点击几次,执行一次之后都不会再执行

<div @click.once="test"></div>

⑧.capture:
事件的完整机制是捕获-目标-冒泡,事件触发是目标往外冒泡

⑨.sync
对prop进行双向绑定
⑩.keyCode:

监听按键的指令,具体可以查看vue的键码对应表

14.vue等单页面应用及其优缺点

优点
Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件,核心是一个响应的数据绑定系统。
数据驱动、组件化、轻量、简洁、高效、模块友好、页面切换快
缺点
不支持低版本的浏览器,最低只支持到IE9;
不利于SEO的优化(如果要支持SEO,建议通过服务端来进行渲染组件);
首屏加载耗时相对长一些;
不可以使用浏览器的导航按钮需要自行实现前进、后退。


浏览器面试题

1.页面刷新不出来,可能是有哪些方面问题

可以从 URL输入到页面显示的步骤进行分析,大概是:

1、域名不存在,或者ip地址错误
2、网络问题,不能建立正常的tcp连接
3、服务器找不到正确的资源

2.浏览器架构

3.浏览器下事件循环(Event Loop)

Task:(宏任务)
1.setTimeout
2.setInterval
3.setImmediate (Node独有)
4.requestAnimationFrame (浏览器独有)
5.I/O
6.UI rendering (浏览器独有)
7.script标签
MicroTask:(微任务)
1.process.nextTick (Node独有)
2.Promise
3.MutationObserver
执行顺序:先是同步任务、再是该同步任务下的微任务,再是宏任务,之后宏任务下的微任务,再是宏任务...
任务队列先进先出,执行栈先进后出。

4.从输入 url 到展示的过程

1、DNS服务器解析域名,找到对应服务器的IP地址;
2、和服务器建立TCP三次握手连接;
3、发送HTTP请求,服务器会根据HTTP请求到数据服务器取出相应的资源,并返回给浏览器;
4、浏览器处理响应
①加载:浏览器对一个html页面的加载顺序是从上而下的。当加载到外部css文件、图片等资源,浏览器会再发起一次http请求,来获取外部资源。当加载到js文件,html文档会挂起渲染(加载解析渲染同步)的线程,等待js文件加载、解析完毕才可以恢复html文档的渲染线程。②解析:解析DOM树和CSSDOM树。
③渲染:构建渲染树,将DOM树进行可视化表示,将页面呈现给用户。

6.存储

7.Web Worker

8.GC垃圾回收机制

1、垃圾回收机制(GC:Garbage Collection),执行环境负责管理代码执行过程中使用的内存。浏览器会在浏览器渲染的空闲时间内清除内存。
2、在V8中,主要将内存分为新生代和老生代,新生代的对象为存活时间较短的对象,老生代中的对象为存活时间较长或常驻内存的对象。
3、栈内存的回收,栈内存在调用栈上下文切换后就会被回收。
4、堆内存的回收
①新生代内存回收机制:新生代内存容量小,默认下,64位系统下仅有32M
②晋升:如果新生代的变量经过复制依然依然存活时,那么就会被放入老生代内存中。晋升有两个条件:
(1)是否经历过新生代的回收
(2)To空间内存占比超过限制
③老生代内存回收机制
(1)V8在老生代中主要采用Mark-Sweep和Mark-Compact相结合的方式进行垃圾回收。主要使用Mark-Sweep,在空间不足以对新生代中晋升过来的对象进行分配时才使用Mark-Compact。
(2)Mark-Sweep:在标记阶段遍历所有堆中的所有对象,并标记活着的对象,在清除阶段清除没有标记的对象。
(3)Mark-Compact:在Mark-Sweep的基础上演变而来,差别在于在标记死亡后,在整理过程中会将活着的对象往一端移动,移动后,直接清理掉边界外的内存,解决Mark-Sweep的内存碎片问题。

9.内存泄露


服务端与网络

1.http/https 协议

1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

2.常见状态码

3.get/ post的区别

1、GET在浏览器回退是无害的,而POST会再次提交请求
2、GET产生的URL地址可以被收藏,而POST不可以
3、GET请求会被浏览器主动缓存,而POST不会,除非手动设置
4、GET请求只能进行url编码,而POST支持多种编码形式

5、GET请求参数会被完整保留在浏览器历史记录里,而post中的参数不会被保留
6、GET请求在url中传递的参数是有长度限制的,而POST没有
7、对参数的数据类型,GET只接受ASCII类型,而POST没有限制
8、GET比POST更不安全,因为参数直接暴露在url上,所以不能用传递敏感信息
9、GET参数通过url传递,POST放在Request body报文体中

4.Websocket

1、webSocket是一种通信协议,是一项可以让服务器将数据主动推送给客户端的技术。
2、基于TCP传输协议,并复用HTTP的握手通道(握手阶段),和http协议同属于应用层,默认端口也是 80 和 443 ,能通过各种 HTTP 代理服务器。
3、数据格式比较轻量,性能开销小,通信高效。
4、可以发送文本,也可以发送二进制数据。
5、没有同源限制,客户端可以与任意服务器通信。
6、协议标识符是ws(如果加密,则是wss),请求的地址就是后端支持websocket的API。

5.TCP 三次握手

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

6.TCP 四次挥手

1、客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
2、服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
3、客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
4、服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
5、客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
6、服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

7.Node 的 Event Loop: 6 个阶段

1、timer阶段:执行到期的setTimeout / setInterval 队列回调;
2、I/O阶段:执行上轮残留的callback
3、idle,prepare:这个阶段仅在内部使用,可以不必理会
4、poll阶段:等待回调。a:执行回调,b:执行定时器(如果遇到setTimeout / setInterval ,则返回到timer阶段。如果遇到setImmediate,则前往check阶段。)
5、check阶段:执行setImmediate()的回调函数。
6、close callbacks阶段:例如:socket.on(‘close’, …)这种close事件的回调。

8.http报文的组成部分

1、请求报文(请求行、请求头、空行、请求体)

2、响应报文(状态行、响应头、空行、响应体)

9.HTTP和HTTP2的区别

1,二进制传输
http2采用二级制传输,相对于http1的文本传输安全性要高

2,多路复用
http一个链接只能提交一个请求,而http2能同时处理无数个请求,可以降低连接的数量,提高网络的吞吐量。

3,头部压缩
http2通过gzip与compress对头部进行压缩,并且在客户端与服务端各维护了一份头部索引表,只需要根据索引id就可以进行头部信息的传输,缩小了头部容量,间接提升了传输效率。

4,服务端推送
http2可以主动推送资源到客户端,避免客户端花过多时间逐个请求,降低相应时间

10.什么是持久连接

1.HTTP(1.1版本才支持)协议采用"请求-应答"模式,当使用普通模式时,即非 "keep-alive" 模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP协议为无连接的协议)。

2.当使用keep-alive模式(又称持久连接、连接重用)时,keep-alive功能使客户端到服务端的连接持续有效,当出现对服务器的后继请求时,keep-alive功能避免了建立或者重新建立连接。

11.什么是管线化

HTTP管线化:是将多个HTTP请求(request)整批提交的技术,而在发送过程中不需先等待伺服端的回应。管线化机制通过持久连接,且只有Get和Post支持,Post有所限制

1.在使用持久连接的情况下,某个连接上消息的传递类似于

请求1->响应1->请求2->响应2->请求3->响应3

2.某个连接上的消息变成了类似这样(管线化)

请求1->请求2->请求3->响应1->响应2->响应3

12.http协议的主要特点

1、简单快速,2、灵活,3、无连接,4、无状态 


Webpack 相关

1.原理简述

把所有依赖打包成一个 bundle.js 文件,通过代码分割成单元片段并按需加载。

2.Loader

loader用于加载某些资源文件。因为webpack本身只能打包common.js规范的js文件,对于其他资源如css,img等,是没有办法加载的,这时就需要对应的loader将资源转化,从而进行加载。

3.Plugin

plugin用于扩展webpack的功能。不同于loader,plugin的功能更加丰富,比如压缩打包,优化,不只局限于资源的加载。

4.编译优化

1、减小代码体积,可以使用CDN引入一些npm包。局部引入一些类库,避免无用的文件的引入。

2、在使用loader的时候,使用exclude和include,减少loader遍历的目录范围,加快webpack的构建速度。

3、在resolve中配置alias,减少检索路径。

4、使用dllPlugin或者allReferencePlugin 进行预先构建,把改变频率比较小的第三方库等依赖单独构建。

5.Chunk

Chunk是Webpack打包过程中,一堆module的集合。我们知道Webpack的打包是从一个入口文件开始,也可以说是入口模块,入口模块引用这其他模块,模块再引用模块。Webpack通过引用关系逐个打包模块,这些module就形成了一个Chunk。

6.Frefetch  这段代码告诉浏览器,这段资源将会在未来某个导航或者功能要⽤到,但是本资源的下载顺序权重⽐较低。也就是说prefetch通常⽤于加速下被标记为prefetch的资源,将会被浏览器在空闲时间加载

7.Preload 通常⽤于本页⾯要⽤到的关键资源,包括关键js、字体、css⽂件。preload将会把资源得下载顺序权重提⾼,使得关键数据提前下载好,优化页⾯打开速度。


算法

1.五大算法

2.基础排序算法

3.高级排序算法

4.递归运用(斐波那契数列): 爬楼梯问题

5.数据树

6.天平找次品


进阶知识

React框架

1.Fiber

2.生命周期

3.setState

4.HOC(高阶组件)

5.Redux

6.React Hooks

7.SSR 服务端渲染

8.函数式编程

  • 4
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值