html标签的语义化是什么意思
b标签和strong标签的区别
css3动画如何实现
JS继承
JS原型链
JS原型
this指向场景
TCP和UDP的区别
UDP是一种无连接,提供不可靠的数据报服务
UDP支持一对多,多对多,一对一服务
TCP是面向连接的,可靠的,基于字节流的传输层通信协议,面向连接,保证顺序,可靠传输,提供拥塞控制
TCP连接
TCP要保证数据可靠传输,也要提供传输效率,保证数据有去有回
TCP断开连接
解释Promise
let和var的区别
AJAX原理
var xhr = new XMLHttpRequest()
xhr.onreadyStateChange = function(){
if(xhr.readyState == 4 && xhr.status == 200) {
}
}
xhr.open(method,url,async)
xhr.send(string))
GET和POST请求数据的区别
POST使用场景
GET使用场景
箭头函数
解决跨域
https://juejin.cn/post/6898572465527029767
什么是跨域
JSONP
function dealData(data) {
}
let scp = document.createElement('script')
scp.src=""
document.body.appendChild(scp)
反向代理
如何获取0-9的随机数
function getRandom(start,end) {
return Math.floor(Math.random() * (end - start + 1) + start)
}
单页面应用会出现什么问题?(f5之后会出现404,前端如何解决?)
单页面优点:
前端如何进行安全防范
XSS攻击
CORF攻击
px/em/rem的区别和应用
设备像素:设备屏幕实际拥有的像素点一般来说:宽度方向有1920个像素点,长度方向有1080个像素点
逻辑像素:css的像素单位,其尺寸大小是相对的,也称为独立像素
分辨率:屏长的设备像素 × 屏宽的设备像素
ppi:像素密度,表示沿对角线每英寸长度的像素数目
设备尺寸 × 像素密度 = 分辨率
px: 我们可以调整页面在移动端的缩放比例,这个值就是viewport,移动端浏览器会将viewport宽度设为980px,也就是说1px = 1/980
em:,需要改变body的font-size,其它的子元素宽度就能动态变化了,一般相对于父级元素的字体大小。一般默认下16px = 1em
HTTP1.x为什么不能实现多路复用
OSI七层协议:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层
EventLoop是什么
事件循环,JS是单线程的,意味着任务需要排队执行,EVentLoop就是避免JS在执行过程中出现阻塞的机制
Vuex是干啥的
vuex是一个专门为vue应用程序开发的状态管理模式,它采用集中式存储管理应用的所有组件的状态
H5新增的API
全屏显示:docuement.requestFullscreen()
关闭全屏显示:document.cancelFullScreen
判断是否是全屏显示:document.isFullscreen()
网络检测:online 当从断网到连网,会触发回调函数
offline 当从联网到断网,会触发回调函数
拖拽源对象
拖拽目标元素
HTML语义化是什么
为什么要语义化
进程和线程的区别,进程间如何通讯,线程间如何通信
进程间如何通信:
JS事件循环机制
箭头函数和普通函数的区别
Vue数据双向绑定是什么意思:
map和foreach的区别:
ajax的readyState五种状态值
base64:文本文件,依赖编码,小图标解决方案
base64编码后图片会膨胀为原文件的4/3
是一种基于64个字符可打印字符来表示二进制数据的表示方法
window.btoa(str) 转码
window.atob(str) 解码
有汉字的时候 window.beta(window.encodeURIComponent(str))转码
解码 window.decodeURIComponent(window.atob(str))
图片
JPG: 有损压缩,不支持透明,体积小,加载快
JPG使用场景:适用于呈现的菜丰富的图片,JPG图片经常作为大的背景图,轮播图出现,
PNG:无损压缩,体积大,质量高,支持透明
PNG优点:无损压缩的高保真的图片格式,PNG图片比JPG更强的色彩表现力,对线条的处理更加细腻,对透明支持更高,唯一的缺点就是体积太大
PNG使用场景:呈现线条细腻,颜色对比度高的LOGO或者背景图
SVG:文本文件,体积小,不失真,兼容性好,压缩性更强
SVG是一种基于XML语法的图像格式,图片无限放大不失真,可编写
CSS边距重叠问题,原因
浏览器原理:
浏览器主要组成部分:
setTimeout 和 setInterval
数组中forEach和map的区别
for in 和 for of的区别
tyoeof 和 instanceof
typeof可以用于检测基本数据类型和引用数组类型
instanceof用于判断一个变量是否是某个对象的实例,看实例的__proto__指向的原型链上,有没有跟右侧类型的prototype指向同一个对象的
原型链:从一个实例对象往上找构造这个实例的相关的对象,然后这个关联的对象再往上找,他又有创建它的上一级的原型对象,依次类推,一直到Object.prototype == nul,这个查找过程就是原型链
清除浮动
父级div定义伪类,after和zoom
原理IE8以上和非IE浏览器才支持:after,zoom是IE专有属性可解决ie6/7浮动问题
优点:
浏览器支持好,不容易出问题
缺点:
代码多
在结尾处添加空div标签 clear:both
原理:添加一个空div,利用css提高clear:both清除浮动,让父级div能自动获取到高度
优点:
简单,代码少,浏览器支持好
缺点:
增加多的空div
父级div定义高度
原理:父级div手动定义高度,就解决了父级div无法自动获取高度的问题
优点:
简单,代码少,容易掌握
缺点:
高度和父级div不一致,会产生布局问题
父级div定义overflow:hidden
原理:浏览器会自动检查福哦的那个区域的高度
优点:
简单,代码少
缺点:
不能和position配合使用,因为超出的尺寸会被隐藏
继承的几种方法
function creatPerson(name,age,job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName=function(){
alert(this.name);
}
return o;
}
var person1 = creatPerson('FE',20,'teacher');
优缺点:虽然解决了创建相似对象的问题,但是没有解决对象识别的问题,即如何知道一饿对象的类型
构造函数模式:
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName=function(){
alert(this.name);
}
}
var person1 = Person('FE',20,'teacher');
优缺点:创建自定义函数意味着将来可以将它的实例标识为一种特定的数据类型,但是每个方法都要在实例上创建一遍
function Person(){
};
Person.prototype.name = "FE";
Person.prototype.age = 20;
Person.prototype.sayName = function(){
alert(this.name);
};
var person1 = new Person();
person1.sayName(); //'FE'
优缺点:可以让所有的实例共享它所包含的属性和方法,原型中的属性和方法是共享的,但是实例一般要有单独的属性和方法,一般很少单独使用原型模式
混合模式:
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.friends=['aa','ss','dd'];
}
Person.prototype.sayName = function(){
alert(this.name);
}
var person1 = new Person('FE',20,'teacher');
优缺点:构造函数模式定义实例的属性,原型模式定义公共的属性和方法
原型链继承:
定义:利用原型让一个引用类型继承另外一个引用类型的属性和方法
function SuperType(){
this.property = 'true';
}
SuperType.prototype.getSuperValue = function(){
return this.property;
}
function SubType(){
this.subProperty = 'false';
}
SubType.prototype = new SuperType();
SubType.prototype.getSubValue = function(){
return this.subProperty;
}
var instance = new SubType();
alert(instance.getSuperValue());//true
优点:简单明了,在弗雷新增运行属性和方法,子类都能访问到
缺点:包含引用类型值的函数,所有的实例都指向一同一个引用地址,修改一个,其它的都会变,不能像超类的构造函数传递参数
构造函数继承
定义:在子类型构造函数的内部调用超类型的构造函数
function SuperType(){
this.colors = ['red','yellow'];
}
function SubType(){
SuperType.call(this);
}
var instance1 = new SubType();
instance1.colors.push('black');
var instance2 = new SubType();
instance2.colors.push('white');
alert(instance1.colors);//'red','yellow','black'
alert(instance2.colors);//'red','yellow','white'
优点:简单明了,直接继承饿了超类型函数的属性和方法
缺点:方法都在构造函数定义,因此函数复用就无从谈起了,而且超类型中的原型的属性和方法,对子类型也是不可见的,结果所有的类型只能使用构造函数模式
组合继承:
定义:使用原型联实现多原型属性和方法的继承,使用构造函数实现实例的继承
function SuperType(name){
this.name = name;
this.colors = ['red','black'];
}
SuperType.prototype.sayName = function()
{
alert(this.name);
}
function SubType(name,age){
SuperType.call(this,name);
this.age = age;
}
SubType.protptype = new SuperType();
SubType.protptype.sayAge = function(){
alert(this.age);
}
优点:解决了构造函数和原型继承中的两个问题
缺点:无论什么时候,都会调用两次超类型的构造函数
几种常见的http状态码
2xx ---- 成功
200 ok成功
204 请求处理成功,但是没有数据返回
206 对资源的某一部分的请求
3xx ---- 重定向
301 url永久重定向
302 临时重定向
304 资源已找到,但是没有找到符合条件的请求
4xx ---- 客户端请求
400 请求报文中存在语法错误
401 需要http认证
403 对请求资源的访问被服务器拒绝了
404 服务器中没有这个资源
500 ---- 服务器错误
500 内部资源出错了
503 服务器正在超负载工作或者停机维护
rem和em的区别:
JSONP安全性问题 ------- CSRF攻击
前端构造一个恶意页面,请求JSONP接口,接收服务器端的敏感信息,如果JSONP接口还涉及一些敏感操作信息,那就更不安全了
解决方法:验证JSONP的调用来源,服务端判断Referer是否是白名单,或者部署随机Token来防御
CORS跨域资源共享,允许浏览气象跨域服务其发出XMR请求,从而客服跨域问题,他需要浏览器和服务器的同时支持
浏览器会自动向请求头部发出origin字段,表明当前请求来源
服务器端需要设置响应头的Access-Control-Allow-Methods,Access-Control-Allow-Headers,Access-Control-Allow-Origin等字段,指定允许的方法,头部,源等信息,
请求方法分为简单和非简单请求,非简单请求会先进行依次OPTIONS方法进行预检,看是否允许当前跨域请求
HTTP1.1
HTTP2:
cache-control:
浏览器:
浏览器是多线程,浏览器多线程包含了Browser线程它是浏览器的主进程,第三方插件进程和GPU进程(它是浏览器的渲染进程),其中GPU进程(多线程)和Web前端密切相关,包含以下进程:
JS引擎线程和事件触发线程:
浏览器页面初次渲染完毕后,JS引起线程结合事件触发线程的工作流程如下:
事件循环机制:
事件触发机制管理的任务队列是如何产生的呢,事实上这些任务就是从JS引擎线程本身产生的。主线程在运行的时候会产生执行栈,栈中的代码调用某些异步API时会在任务队列中添加事件,栈中的代码执行完毕后,就会读取任务队列中的事件,去执行事件对应的回调函数,如此循环往复,形成事件循环机制
任务队列:
它们之间区别如下:
当前宏任务执行后,会将在它执行期间产生的所有微任务都执行一遍
理解:
Vue异步执行DOM更新,只有观察到数据变化,Vue将开启一个队列,并缓冲在同一事件循环中发生的所有数据改变。如果同一个watcher被多次触发,只会被推入到队列中一次。这种在缓冲时去除重复数据对于避免不必要的计算和DOM操作上非常重要。然后再下一个事件循环tick中,Vue刷新队列中并执行实际工作,Vue内部尝试对异步队列使用原生Promise.then和MessageChannel,如果执行环境不支持,会采用setTimeout(fn,0)替代
例如:当你设置vm.someData = ‘new value’,该组件不会立即重新熏染。当刷新队列时,组件会在事件循环队列情清空下一个tick更新。多数情况下我们不需要关心这个个过程。但是如果你想在DOM状态更新后做点什么。为了再数据变化之后等待Vue完成更新DOM,可以再数据变化之后立即使用Vue.tick(callback)。这样回调函数在DOM更新完成之后就会调用
CSS选择器优先级:
不同级别:!Important > 行内样式 > ID选择器 > 类选择器/属性选择器/伪类选择器 > 元素选择器/关系选择器/伪元素选择器 > 通配符选择器
BFC是什么:
重点是BFC是什么,
触发的条件是什么,
BFC可以干什么:
什么是BFC:
BFC全称为块级格式化上下文,BFC是W3C规范中一个概念,它决定了元素如何对其内容进行定位以及与其它元素的关系相互作用,当涉及到可视化布局的时候,Block Formatting Context提供了一个环境,HTML元素在这个环境中按照一定规则进行布局。一个环境中的元素不会影响其它环境中的布局。比如福哦的那个元素会形成BFC,浮动元素内部子元素的主要受浮动元素影响,两个浮动元素之间是不互不影响的。这里有一个类似一个BFC就是一个独立的行政单位的意思。可以说BFC就是一个作用范围,把他理解为是一个独立的容器,并且这个容器里box的布局与这个容器外的box毫不相干
触发BFC的条件
·- 根元素或其他包含它的元素
·- 浮动元素,元素的float不是none
·- 绝对定位元素,元素具有position为absolute或fixed
·- 内联块,元素具有display:inline-block
BFC的约束规则:
BFC可以解决的问题
·垂直外边距重叠问题:就是网页中垂直方向的相邻外边距会发生重叠
·去除浮动
·自适应两列布局
了解盒模型:
如何实现左侧宽度固定,右侧宽度自适应的布局
<div class="box"> <div class="box-left"></div> <div class="box-right"></div> </div>
.box {
height: 200px; }
.box > div {
height: 100%; }
.box-left {
width: 200px; float: left; background-color: blue; }
.box-right {
margin-left: 200px; background-color: red; }
.box {
height: 200px; }
.box > div {
height: 100%; }
.box-left {
width: 200px; float: left; background-color: blue; }
.box-right {
width: calc(100% - 200px); float: right; background-color: red; }
.box {
height: 200px; }
.box > div {
height: 100%; }
.box-left {
width: 200px; float: left; background-color: blue; }
.box-right {
overflow: hidden; background-color: red; }
了解跨域吗,一般什么情况下会导致跨域
什么是CORS
CORS跨域资源共i想允许浏览器向服务器发出XMLHtppRequest,从而克服跨域问题,它需要浏览器和服务器的同时支持
·浏览器会自动向请求头添加origin字段,表明当前请求来源
·服务端需要设置响应头为Access-Control-Allow-Methods,Access-Control-Allow-Headers,Access-Control-Allow-Origin等字段,指定允许的方法,头部源等信息
·请求分为简单请求和非简单请求,非简单请求会先进行一次OPTION方法进行预检,看是否允许当前跨域请求
简单请求
请求方法是以下三种方法之一:
·HEAD
·GET
·POST
HTTP的请求头信息不超出以下几种字段
· Accept
· Accept-Language
· Content-Language
· Last-Event-ID
· Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
。
HTTP2和HTTP1有什么区别
相对于HTTP1.0,HTTP1.1的优化:
·缓存处理:多了Entity tag,If-Unmodified-Since,If-Match,If-None-Match等缓存信息
·带宽优化及网络连接的使用
·错误通知的管理
·Host头处理
·长连接:HTTP1.1中默认开启Connection:keep-alive,一定程度上弥补了HTTP.0每次请求都要创建连接的缺点
相对于HTTP1.1,HTTP2的优化:
你能说说缓存吗:
缓存分为强缓存和协商缓存。强缓存不过服务器,协商缓存需要过服务器,协商缓存返回的状态码是304.两类缓存机制可以同时存在,强缓存的优先级高于协商缓存。当执行强缓存时如若缓存命中,则直接使用缓存数据库中的数据,不再进行协商缓存
强缓存:
Expires:Expires的值为服务器端返回的的数据到期事件,当再次请求的请求时间小于返回的时间,则直接使用缓存数据。但是由于服务器端时间和客户端时间可能有误差,这也将导致缓存命中的误差。另一方面,Expires是HTTP1.0的产物,所以现在大多数使用cacle-control替代
缺点:使用的是绝对时间,如果服务端和客户端的时间产生偏差,那么会导致命中缓存产生偏差
协商缓存:
协商缓存选用进行对比判断是否可以使用缓存。浏览器第一次i请求数据的时候,服务器会将缓存标识与数据一起响应给客户端,客户端将它们备份至缓存中。再次请求的时候,客户端会将缓存中的标识发送给服务器,服务器根据此标识判断。若未失效,发回304状态码,浏览器拿到此状态码就可以直接使用缓存数据了
Last-Modified:服务器在响应请求的时候,会告诉浏览器资源的最后修改时间
If-Modified-Since:浏览器再次请求服务器的时候,请求头会包含字段,后面跟着在缓存中进行获取最后修改时间,如果一致返回304和响应报文头,浏览器只需要从缓存中获取信息即可
· 如果真的被修改:那么开始传输响应一个整体,服务器返回:200 OK
· 如果没有被修改:那么只需传输响应header,服务器返回:304 Not Modified
缓存场景:
对于大部分的场景都可以使用强缓存配合协商缓存解决,但是在一些特殊的地方可能需要选择特殊的缓存策略
能说说首屏加载优化有哪些方案吗?
你知道null和undefined有什么区别吗?
闭包有什么作用:
闭包就是能够读取其它函数内部变量的函数。由于在js语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单的理解成 定义在一个函数内部的函数,所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁
Vue响应式原理:
在生成vue实例的时候,为对传入的data进行遍历,使用Object.defineProperty把这些属性转为getter/setter
Object.defineProperty是ES5中一个无法shim的特性,这也就是Vue不支持IE8以及更低版本浏览器的原因
每个Vue实例都有一个watcher实例,它会在实例渲染的时候记录这些属性,并在setter触发的时候重新渲染
Vue不允许动态添加跟级别的响应式属性,但是可以使用vue.set(object,propertyName,value)方法向嵌套对象添加响应式属性
2.声明响应式属性
由于 Vue 不允许动态添加根级响应式属性,所以你必须在初始化实例前声明所有根级响应式属性,哪怕只是一个空值。
如果你未在 data 选项中声明 message,Vue 将警告你渲染函数正在试图访问不存在的属性。
3. 异步更新队列
Vue更新dom是异步执行的
数据变化,更新是在主线程中同步执行的,在侦听到数据变化的时候,watcher将数据变更存储到异步队列中,当本地数据变化,即主线程任务执行完毕,异步执行的任务才会被执行
如果你在js中更新数据后立即去操作DOM,这时候DOM还未更新,vue提供了nextTick接口来处理这样的情况,它的参数是一个回调函数,会在本次DOM更新完成后被调用
了解Event Loop吗? 也就是事件循环机制
如何避免你回流和重绘?
浏览器渲染过程如下:
解析HTML,生成DOM树,
解析CSS,生成CSSOM树
将DOM树和CSSOM树结合,生成渲染树
Layout回流:根据生成的渲染树,进行回流,得到节点的几何信息
Patinting重绘:根据渲染树以及回流得到的几何信息,得到节点的绝对像素
Display:将像素发送给GPU,展示在页面上,这一步其实还有很多内容,比如会在GPU将多个合成层合并同一个层,并展示在页面中,css3硬件加速的原理则是新建合成层
何时触发回流和重绘
合适发生回流:
如何避免触发回流和重绘
CSS
XSS攻击:
XSS攻击是指攻击者在网站上注入恶意的客户端代码,通过恶意脚本对客户端网页进行修改,从而在用户浏览网页时,对用户浏览器进行控制或者获取用户隐私数据的一种攻击方式
攻击者对客户端网页注入的而已脚本一般包括js,有事也会包括HTML和Falsh。有很多中方式进行XSS攻击,但他们的共同点为:将一些隐私数据像cookie,session发送给攻击者,将受害者重定向到一个攻击者控制的网站,在受害者的机器上进行一些恶意操作
XSS攻击可以分为三类:发射型–非持久型,存储型—持久型,基于DOM
反射型 XSS :
只是简单地把用户输入的数据 “反射” 给浏览器,这种攻击方式往往需要攻击者诱使用户点击一个恶意链接(攻击者可以将恶意链接直接发送给受信任用户,发送的方式有很多种,比如 email, 网站的私信、评论等,攻击者可以购买存在漏洞网站的广告,将恶意链接插入在广告的链接中),或者提交一个表单,或者进入一个恶意网站时,注入脚本进入被攻击者的网站。最简单的示例是访问一个链接,服务端返回一个可执行脚本
存储型 XSS:
存储型XSS会把用户输入的数据存储在服务器端,当浏览器请求数据的时候,脚本从服务器上传回并执行,这种XSS攻击具有很强的稳定性,比较常见的一个场景是攻击者在社区或论坛上写下一篇包含恶意js代码的文章或评论,文章或评论发表后,所有访问该文章的用户,都会在他们的浏览器中执行这段恶意的js代码
基于DOM XSS:
基于DOM的XSS攻击是指通过恶意修改脚本页面DOM结构,是纯粹发生在客户端的攻击
XSS攻击防范:
HttpOnly 防止截取Cookie:HttpOnly最早由微软提出,至今已经成为一个标准。浏览器将禁止页面的js访问带有HttpOnly属性的Cookie。上文有说到,攻击者可以通过注入恶意脚本获取用户的cookie信息。通常Cookie中都包含了用户的登录凭证信息,攻击者在获取到Cookie之后,则可以发起Cookie劫持攻击,
Cookie
Cookie是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向统一服务器再发起请求时被携带并发送到服务器上。Cookie主要用于以下三个方面
·会话状态管理,如用户登录状态,购物车,游戏分数或其它需要记录的信息
·个性化设置 ,如用户自定义设置,主题
·浏览器行为跟踪。跟踪分析用户行为
而浏览器所持有的Cookie分为两种:
NextTick:
Vue官方对nextTick的解释:
在下次DOM更新循环结束之后执行延迟回调,再修改数据之后立即使用这个方法,获取更新后的DOM
Flex弹性布局:
Flex是Fkexble Box的缩写,意为弹性布局,用来为盒装模型提供最大的灵活性
注意;设为Flex布局以后,子元素float,clear和vertical-align属性将失效
基本概念:采用Flex布局以后,称为Flex容器,简称为容器,他的所有子元素自动成为容器成员,称为Flex项目
以下六个属性设置在容器上:
Row默认值:主轴为水平方向,起点在左端
row-reverse:主轴为水平放i想,起点在右端
Column:主轴为垂直方向,起点在上沿
column-reverse:主轴为垂直方向,起点在下沿
2. Flex-wrap属性
默认情况下,项目都排在一条线上,flex-wrap属性定义,如果一条轴线排不下,如何换行
Flex-wrap:nowrap/wrap/wrap-reverse
Nowrap:不换行
Wrap:换行,第一行在上方
Wrap-reverse:换行,第一行在下方
3. Flex-flow
属性是flex-direction属性和flex-wrap水性的缩写形式,默认值为row nowrap
4. justify-content属性
·justify-content属性定义了项目在主轴上的对齐方式
Flex-start在前面 左对齐
Flex-end 在后面右对齐
Center 在中间 居中
Space-between 在整个页面进行居中排列两端对齐,项目之间的间隔都相等。
Space-around每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。
伪类和伪元素的区别:
伪类和伪元素是用来修饰不在文档树中的部分,比如一句话中的第一个字母,或者是列表中第一个元素,下面分别对伪类和伪元素进行解释:
伪类用来当已有元素处于的某个状态时,为其添加对应的样式,这个状态是根据用户行为而动态变化的,比如说,当用户悬停在指定的元素时,我们可以通过:hover来描述这个元素的状态,虽然他和普通的css类似,可以为已有的元素添加样式,但是他只有dom’树无法描述的状态下才能为元素添加样式,所以将其称为伪类
伪元素用来创建一些不再文档树中的元素,并为其添加样式,比如说:我们可以通过:before来一个元素前添加一些文本,并未这些文本添加样式,虽然用户可以看到这些文本,但是这些文本实际上不在文档树中
区别:
DOM的事件流:
事件流之事件冒泡与事件捕获
在浏览器发展过程中,开发团队遇到了一个问题,那就是页面的哪一部分用于特定的事件?
浅拷贝和深拷贝的区别: