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是依赖就近,用的时候采取解析加载模块。