面经知识点总体整理复习(一):

134 阅读8分钟

1.JS创建对象的方式:字面量、new关键字、Object.create来创建(第一个参数为生成对象的原型)修改生成的对象不会影响继承的对象。

2.类的实现:ES5是用构造函数定义类的,ES6是用class关键字定义类的(语法糖)。函数放在原型上面利于继承。增强JS类。

3.Vue的程度:

  • MVVM(数据的双向绑定 数据通过绑定更新View View通过DOM事件更新Model ViewModel通常要实现一个observer观察者,当数据发生变化,ViewModel能够监听到数据的这种变化,然后通知到对应的视图做自动更新,而当用户操作视图,ViewModel也能监听到视图的变化,然后通知数据做改动,这实际上就实现了数据的双向绑定。并且MVVM中的View 和 ViewModel可以互相通信。前端的项目越来越大,项目的可维护性和扩展性、安全性等成了主要问题。当年为了解决浏览器兼容性问题,出现了很多类库,其中最典型的就是jquery。但是这类库没有实现对业务逻辑的分成,所以维护性和扩展性极差。综上两方面原因,才有了MVVM模式一类框架的出现。比如vue,通过数据的双向绑定,极大了提高了开发效率  订阅发布模式 观察者模式  一对多的关系 多个观察者监听某一个主题对象 不同对象get绑定到各自的dep 然后dep自动连接到使用到对象的wather set时 通过dep触发water的更新)。
  • 架构,Vue3.0,Vue-router,Vuex,axios推荐使用。原理是利用类的set get方法,触发DOM更新。

4.CSS BFC:

  • FC(Formatting Context),直译过来是格式化上下文,它是页面中的一块渲染区域,有一套渲染规则,决定了其子元素如何布局,以及和其他元素之间的关系和作用。常见的FC有BFC、IFC(行内),还有GFC(GridLayout Formatting Contexts)和FFC(Flex Formatting Contexts)。一个BFC的范围包含创建该上下文元素的所有子元素,但不包括创建了新BFC的子元素的内部元素。这从另一方角度说明,一个元素不能同时存在于两个BFC中。因为如果一个元素能够同时处于两个BFC中,那么就意味着这个元素能与两个BFC中的元素发生作用,就违反了BFC的隔离作用。display:table也可以生成BFC的原因在于Table会默认生成一个匿名的table-cell,是这个匿名的table-cell生成了BFC。

  • 阻止元素被浮动元素覆盖。

5.两栏布局:flex布局 flex:1。

6.JS通过arguments这个维数组来实现函数重载。ES6使用剩余参数...来定义重载函数,用扩展运算符...来调用重载函数。

7.CSS实现三角形:

  • 利用border属性形成三角形。
  • 设置内部div 宽度为0 其他边color隐藏就行了。
  • 注意其他形状的扩展。

8.选择器和优先级:

  • 通配、标签,伪元素、类,伪类,属性、id、行内、!important.
  • 同等优先级下,越靠近目标元素的样式优先作用。
  • css渲染引擎从右往左搜索选择器,所以使用不同选择器对性能有所影响。

9.组合继承,手动实现:

  • 在子类调用父类的构造函数,利用call函数进行属性的继承。

  • 后面令子类的prototype属性为父类的实例,便可以继承方法了。

  • 称之为组合继承。

  • 组合继 承也保留了 instanceof 操作符和 isPrototypeOf()方法识别合成对象的能力。

  • 其他继承方式:

10.display有哪些属性?分别说说这些属性

  • 外部 流布局下的值

  •  block:换行 块级元素方式显示

  • inline:行内元素 显示

  • inline-block:行内块级元素 

  • 内部 上下文布局

  • flex:伸缩布局

  • grid:网格布局

  • inline-grid:行内网格

  • flow-root:流布局

  • 块级 特性

  • none:隐藏布局

  • contents:

  • 两元的:block flow \ inline flow \ block flex

  • table:表格属性

  • table-row —— table元素都有一个对应的dispaly的值。

  • list-item:列表属性

  • inherit之类的全局的值。

  • visibility: hidden和display: none的区别仅仅在于display: none隐藏后的元素不占据任何空间,而visibility: hidden隐藏后的元素空间依旧保留。visibility具有继承性。visibility: hidden不会影响计数器的计数。

  • 、visibility具有继承性。

  •  CSS3的transition支持visibility属性,但是并不支持display,由于transition可以延迟执行,因此可以配合visibility使用纯css实现hover延时显示效果。提高用户体验。

  • 还有回流问题,display:none是会有回流,但是visibility: hidden; 是不会有回流的。

11.gird布局:网格布局。

  • 格式:<'grid-template'> | <'grid-template-rows'> / [ auto-flow && dense? ] <'grid-auto-columns'>? | [ auto-flow && dense? ] <'grid-auto-rows'>? / <'grid-template-columns'>。

12.ol是有序列表,ul是无序列表。

13.304状态码的意思:自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。如果网页自请求者上次请求后再也没有更改过,您应将服务器配置为返回此响应(称为 If-Modified-Since HTTP 标头)。服务器可以告诉 Googlebot 自从上次抓取后网页没有变更,进而节省带宽和开销。

14.浏览器缓存:协商缓存,由服务器来确定缓存是否可用,所以客户端与服务器端要通过某种标识来进行通信,从而让服务器判断请求资源是否可以缓存访问。

15.http2.0新特性:

  • 首部压缩
  • 多路复用
  • 二进制分帧
  • 服务端推送

16.https:由http和ssl协议构建的可进行加密传输和身份认证的网络协议。

  • 客户使用HTTPS URL来访问服务器,则要求WEB服务器建立SSL链接。
  • web服务器接收到客户端的请求之后,会将网站的证书(证书中包含了公钥),返回给客户端。
  • 客户端和web服务器开始协商SSL链接的安全等级,也就是加密等级。
  • 客户端浏览器通过双方协商一致的安全等级,建立会话会话密钥,然后通过网站的公钥来加密会话密钥,并传送给网站。
  • web服务器通过自己的私钥解密出会话密钥。
  • web服务器通过会话密钥与客户端之间进行通信。

17.XSS攻击:跨脚本攻击。

  • 攻击形式:通过html标签注入,篡改网页,插入恶意的脚本,前端可能没有经过严格的校验直接就进入到数据库,数据库又通过前端程序又回显到浏览器。

  • 攻击可以拿到用户的一些信息,例如cookei获得敏感信息,甚至自己建网站,做一些非法的操作;或者,拿到数据之后以用户的 身份进行勒索,发一些不好的信息等。

  • 防御:

  • cookie设置HttpOnly属性,只能通过http协议拿到。

  • 对用户输入的信息进行过滤。避免注入恶意脚本。

18.aixos原理:

19.websocket:

20.四次挥手:

21.JS和DOM执行机制的问题,在浏览器上面的执行:

22.window.onload()执行条件:

23.vue怎么实现computed;

24.cli相关的:

25.css实现方框缩小的动画:

26.tcp和udp:

27.UI框架:

28.html、css、js的最新版本的官方文档大致浏览一遍。

  • html:

29.nodeJs:

30.先来看两者(两者都是服务于客户端的模块化实现)的定义:

CMD:公共模块定义规范。规定一个单独的文件即是一个模块。每一个模块就一个单独的 作用域,也就是说,在该模块内部定义的变量,无法被其他模块读取,除非定义为global对象的属性。模块只有一个出口,module.exports对象,我们需要把模块希望输出的内容放入该对象。加载模块,使用require方法,该方法读取一个文件执行,返回文件内部的module.exports对象。实现方式有:SeaJs等。其推崇依赖就近。经常用文件名作为模块的id。

AMD:异步模块定义规范。其不是JavaScript原生支持。是RequireJS在推广过程中对模块定义的规范化产出的。异步加载模块,在回调函数中处理逻辑。实现方式有:RequireJS。

区别:

定义时的区别:AMD推崇依赖前置,在定义模块的时候就要声明其依赖的模块。CMD推崇就近依赖,只有在用到某个模块的时候再去requrie。

执行时:对依赖模块的执行时机处理不同。加载时都是异步加载的,但是执行时,AMD加载完成之后就会执行该模块,所以依赖模块之间的执行顺序是不确定的,哪个先加载,哪个先执行,主逻辑在所有依赖加载执行完毕之后执行。但CMD,加载完后并不立即执行模块,进入主逻辑之后,根据requrie的顺序进行执行对于的模块,模块的执行顺序和书写书写是一样的。

加载上:其实两者都是异步加载模块,但是AMD是依赖前置,可以提前把依赖模块全部加载完毕,而CMD是依赖就近,用的时候采取解析加载模块。