赞
踩
目录
meta 标签由多个属性的参数确定,content表示参数对应的参数值
属性
作用:提高网站的SEO,可以通过对Keywords和description的设置来提高网站的搜索点击率
语义化标签
结构清晰便于阅读,便于开发和维护,有利于seo,提升了用户体验
媒体标签:视频video,音频<audio>
表单新增属性:如文本提示属性
新增input类型:如指定输入的内容必须是邮箱格式或日期格式
dom查询操作:document. querySelector返回html中匹配的第一个元素或document. queryAllSelector返回html中匹配的所有元素
新增选择器
过渡属性:transition是一个过渡的效果没有中间状态,它的实现需要触发事件(⽐如光标经过或点击)才执行,需要设置开始帧和结束帧
动画属性:nimation是一个动画效果,不需要触发事件就可以⾃⼰执⾏,且可以设置循环等属性。可以设置多个关键帧完成动画可以在任意一个中间帧设置状态
圆角属性:border-radius 可接收1到4个值,指定每个角相应的弧度
边框属性:border-radius:创建圆角边框;box-shadow:为元素添加阴影
背景色渐变
文字和盒子阴影
grid和flex布局
定义:网页能够兼容不同的设备宽高,网页布局会根据不同视口来动态调整
原理:通过媒体查询检测不同的设备屏幕尺⼨做处理,⻚⾯头部必须有mate声明的 viewport才能兼容
动态em/rem
概念:em相对于父元素字体大小的单位,rem是一个相对于页面根元素字体大小的单位,它的大小是会随着根元素html的font-size的改变而改变的,根据不同屏幕尺寸设置不同根元素html的字体大小,它随视口大小等比缩放
方法:flexible.js是淘宝为了适配移动端开发的JS插件,使不同的终端设备都能实现页面匹配,它根据不同的宽度给网页中html根节点设置不同的font-size,然后所有的px都用rem来代替这样就实现了不同大小的屏幕都适应相同的样式了
viewpoint
概念:vw表示相对于视图窗口的宽度,vh表示相对于视图窗口高度;1vw /h= 1/100视口宽度/高度
使用情况:移动端和PC端可用同一套代码,适用于简单网页如企业官网
媒体查询
概念:在css文件中针对不同的媒体类型或不同的屏幕尺寸设置不同的样式,重置浏览器大小的过程中页面也会根据宽高重新渲染页面
媒体类型:all: 在所有设备都加载,print 在打印模式下加载,screen 电脑屏幕,平板电脑,智能手机等中加载
原理:如果媒体查询中指定的媒体类型匹配展示文档所使用的类型且表达式都为true ,则媒体查询内的样式将会生效
概念:左边一栏宽度固定,右边一栏宽度自适应,且左右两边不能重叠
方法
概念:左右两栏宽度固定,中间⾃适应的布局
方法
定义
灵活高效地实现居中、对齐等有规律的弹性布局;采用flex布局的元素称为flex容器,容器内的子元素称为项目
容器属性
项目属性
flex:1 表示什么
自动填充满剩余空间,布局最后一个盒子时使用fex: 1便可得到整个剩余宽度
概念:bfc是块级格式化上下文,实现一个独立的容器,里面的子元素与外面的元素不会相互影响
哪些元素会生成bfc:
特点
解决的问题
使用 border 的边框实现
原理:主要用到的是border属性,边框是由四个三角形拼接成的;通过上下左右边框来控制三角形的方向,用边框的宽度比来控制三角形的角度,让任何三边的边框的颜色为 transparent,则可以得到各种角度的三角形
线性渐变 linear-gradient 实现
实现一个 45° 的渐变,让它的颜色从渐变色变为两种固定的颜色,再让其中一个颜色透明即可
基本数据类型 (值类型)
引用数据类型
存储位置
浅拷贝
定义:对于引用数据类型只是复制了对象的引用地址,新旧对象还是共享同一块内存,修改其中一个对象的值另一个对象的值也会改变
方法:Object.assign、Array.prototype.slice(),、Array.prototype.concat()
深拷贝
定义:不但拷贝了指针而且还拷贝了数据即为拷贝的对象开辟了一片新内存空间,两个对象属性相同但对应两个不同地址,修改新对象不会影响原对象
方法:构造一个深拷贝函数通过递归调用的方式拷贝每一层;借用JSON对象的stringify方法和parse方法来分别实现序列化和反序列化
区别
对于基本数据类型两者都是直接复制数据值,区别在于引用数据类型的复制
扩展运算符和object. assigh的拷贝分析:浅拷贝;只能拷贝一层数组或对象即里面只有基本数据类型元素//因为这种拷贝只能拷贝一层而刚好可以覆盖,如果包含多层元素即含有引用类型数组或对象时的元素时除第一层外都不能拷贝
为什么0.1+0.2≠0.3
浮点数精度造成的:十进制转二进制时只能存储52位的小数,在保留53位有效数字后产生了误差;由于十进制的0.1只能在二进制中用近似0.1的数表示,再从二进制转换为十进制数时这种误差便反映到了结果中
解决办法:用tofixed方法并保存两位小数点
显式转换
隐式转换(自动转换)
定义:是函数的内置对象,存储了传递的所有实参;它是一个伪数组:属性是从 0 开始依次递增的数字,还有长度这些属性;但它却没有数组方法如pop和push
类数组转换为数组的方法
遍历方法:先转化为数组再遍历
DOM:DOM 指的是文档对象模型,以文档为对象定义了处理网页内容的方法和接口
常见的DOM操作有哪些
获取父节点
创建新节点并设置内容
把新创建的节点用appendChild方法加到父节点后
BOM
BOM 指的是浏览器对象模型,它指的是把浏览器当做一个对象来对待,这个对象主要定义了与浏览器进行交互;它既是通过 js 访问浏览器窗口的一个接口,又是一个 Global(全局)对象。这意味着在网页中定义的任何对象,变量和函数,都作为全局对象的一个属性或者方法存在
在变量声明的前段代码中就能访问到该变量而不会报错
变量提升:声明一个变量的时候,该变量会被提升到作用域最前面,但是执行部分并不会被提升
函数提升:js代码执行之前,会把函数名提升到作用域最前面,值为undefined以函数形式来进行调用会报错,而函数执行部分不提升;把所有的函数声明提升到作用域最前面且优先级高于变量提升,但是不提升调用函数;
原理
JS的运行机制分两步操作即解析和执行:预解析是把所有的var和function提升到作用域的最前面;在执行阶段,就是按照代码的顺序依次执行
作用:声明提升可以提高性能,让函数可以在执行前预先为变量分配栈空间;提高JS代码的容错性,使一些不规范的代码也可以正常执行
箭头函数和普通函数的区别
字符串新增方法
es6新增扩展
数组新增
对象新增
解构表达式
const stu = { name: ′Bob′, age: 24} const { name, age } = stu //变量name提取到了'bob', age提取到了24
复杂对象解构:通过冒号+{目标属性名}这种形式,进一步解构它,一直解构到拿到目标数据为止,const { classes: { stu: { name } }} = school
增
push()将元素添加到数组末尾,返回数组的最新长度
unshift()将元素添加到数组开头,然后返回新的数组长度
splice:传入三个参数,分别是开始位置、0、插入的元素,会影响原数组
concat()首先会创建一个当前数组的副本,然后再把它的参数添加到副本末尾,最后返回这个新构建的数组,不会影响原始数组
删
pop() 方法用于删除数组的最后一项,同时减少数组的length 值,返回被删除的项
shift()方法用于删除数组的第一项,同时减少数组的length 值,返回被删除的项
splice()传入两个参数,分别是开始位置,删除元素的数量,返回修改后的数组
slice(start,end):返回一个新数组(不会改变原数组),截取从start到end(不包含end)的数组
查
indexOf()返回要查找的元素在数组中的位置,如果没找到则返回 -1
includes()返回要查找的元素在数组中的位置,找到返回true,否则false
find()返回第一个匹配的元素
排序
reverse()将数组元素方向反转
sort()方法接受一个比较函数,用于判断哪个值应该排在前面
拼接方法
join()
遍历方法
for…of 遍历获取的是对象的元素值,for…in 获取的是对象的key或数组,字符串的下标
for… in 会遍历对象的整个原型链,性能非常差不推荐使用,而 for … of 只遍历当前对象
filter()
过滤数组中的元素,返回包含符合条件的元素的数组
every() 和 some()
对数组中的元素检查看是否满足某一条件:some()只要有一个是true,便返回true;而every()只要有一个是false,便返回false.
find() 和 findIndex()
检查符合函数中数组元素的值:find()返回的是第一个符合条件的值;findIndex()返回的是第一个符号条件的元素下标
keys、values、entries
keys – 返回元素索引
values – 返回元素值
entries – 返回元素值和下标
reduce和reduceright
累加器会迭代数组的所有项,然后构建一个最终返回值:reduce()对数组从第一项开始遍历;reduceRight()对数组从最后一项遍历
reduce跟常用的map,forEach一样,也是用于遍历循环并且可以设置初始值
增
除了常用+以及${}进行字符串拼接之外,还可通过concat用于将一个或多个字符串拼接成一个新字符串
删
substr(a,b),从下标为a的位置开始截取,一直截取到下标为b的位置
如果只有一个参数a,则从下标a开始截取至字符串末尾
substring(a,b),是从下标为a的位置开始截取,截取到下标为b-1的位置
改
trim()、trimLeft()、trimRight()删除前、后或前后所有空格符,再返回新的字符串
toLowerCase()、 toUpperCase()大小写转化
查
startWith()、includes()从字符串中搜索传入的字符串,并返回一个表示是否包含的布尔值
indexOf()从字符串开头去搜索传入的字符串,并返回下标(如果没找到,则返回 -1 )
转换方法
split('x') 方法
用于把一个字符串通过x分割成由单个字符组成的数组(但数组中的元素仍然是字符串形式),"2:3:4:5".split(":") //将返回["2", "3", "4", "5"]
变量的作用范围只在模块内,避免了全局污染
模块之间是按顺序同步执行的
模块首次执行后会缓存,再次执行时会返回缓存的结果
import命令用于输入其他模块提供的功能
export命令用于规定模块的对外接口
CommonJS是模块运行时加载,es6模块是编译时输出接口
CommonJS模块的导入是同步加载模块,es6是异步加载
CommonJS是输出值的拷贝,es6模块输出的是值的引用
构造函数:把对象中公共的属性和方法抽取出来封装到这个函数里实现代码复用,它用来初始化对象,即与new一起使用创建一个新对象
实例成员和静态成员
实例成员:由构造函数创建出来对象才能调用的属性和方法
静态成员:由构造函数直接调用的属性、方法
new的执行过程
在内存中创建一个空对象
将构造函数的this绑定到新对象上(将对象与构造函数通过原型链连接起来)
执行构造函数中的代码,为新的对象添加属性和方法
返回这个新对象
原型prototype
定义:每个构造函数都有一个prototype对象,这个对象的所有属性和方法都会被构造函数所拥有,函数的 prototype 属性指向了一个对象,这个对象正是调用该构造函数而创建的实例的原型
意义
原理
如果对象本身没有对应的属性或者方法,就会查看构造函数的原型对象prototype,如果有就会返回它的属性值或调用方法
相关属性
原型链
原理
所有函数都可以看做是Function()的实例,即它们的构造函数就是Function(),所有对象都是object的后代,即所有类都是object的实例对象
谁调用this,this就指向谁,没有调用者则指向window
作用:调用该函数并改变该函数内this的指向,相当于让方法中括号内的对象调用该函数;
第一个参数都是this要绑定的对象,如果没有或参数为undefined或null,则默认指向全局window
区别:
传参
执行时机
浏览器的垃圾回收机制
减少垃圾回收的方式
虽然浏览器可垃圾自动回收,但是当代码比较复杂时来的代价比较大,所以应该尽量减少垃圾回收
内存泄漏
内存泄漏是指由于疏忽造成程序未能释放已经不再使用的内存,造成系统内存的浪费,会影响程序运行
异步概念
同步任务和异步任务
为什么需要异步
JS是单线程的遇到耗时任务容易会堵塞,影响后续代码的执行且造成资源浪费,通过异步的事件循环机制提升效率而避免程序阻塞,即解决单线程的缺点
JS单线程
规则
执行顺序
首先直接输出执行栈中同步任务,同步任务清空时再往下调用任务队列中的异步任务
检查微任务队列,将可执行的微任务拿到执行栈中执行
微任务队列清空后再将宏任务队列中的任务拿到执行栈执行
回到第二步继续循环
把一个函数以参数的形式写到函数里,不会马上执行它而是等到重新执行这个任务的时候,再调用这个函数;回调函数易于实现、便于理解,但需要依次执行多个异步操作时会层层嵌套造成的回调地狱不利于代码维护
定时器为何不准确 如何解决
并不是隔n秒后就立即执行回调函数,而是n秒后才加入宏任务队列;如果队列前面还有其他任务,则要等这些任务执行完再执行
解决方法
动态计算时差:根据定时器最开始时间计算当前时间(回调函数执行时间)与开始时间的误差,用期望时差减误差作为下一次任务的时间间隔;使用 web Worker:将定时器函数作为独立线程执行
缺点:不能保证在预期的时间执行任务;如果定时器执行过程中出现了耗时操作,多个回调函数会在耗时操作结束以后同时执行,这样会降低性能
会把每一帧中的所有DOM操作集中起来,在一次重绘或回流中就完成,并且重绘或回流的时间间隔紧紧跟随浏览器的刷新频率;自带节流功能,该函数的延时效果是精确的,没有其他定时器时间不准的问题
定义:Promise里面保存着某个未来才会结束的事件即异步操作的结果,是为了解决回调地狱而产生的
好处:将回调函数的嵌套,改成链式调用;提供了简洁的API,使得控制异步操作更加容易
原理:每一个异步任务返回一个Promise对象,该对象有一个then方法,允许指定回调函数;回调函数变成了链式写法,每个异步函数执行完成后,才会去执行下一个then函数但是造成了代码冗余问题
状态:
基本用法
Promise作为构造函数接受一个函数作为参数使用new Promise()来创建promise对象,该函数的两个形参分别是resolve和reject分别处理成功和失败两种情况,并通过p.then获取处理结果(p. then后有两个函数,分别对应成功和失败的两个结果)
API
finally方法用于指定不管 Promise 对象最后状态如何,在执行完then或catch指定的回调函数以后,都会执行finally方法指定的回调函数。
接收一个数组,数组的每一项都是一个promise对象。当数组中所有的promise的状态都达到resolved的时候,all方法的状态就会变成resolved,如果有一个状态变成了rejected,那么all方法的状态就会变成rejected;Promise.all可以将多个Promise实例包装成一个新的Promise实例。成功的时候返回的是一个结果数组,而失败的时候则返回最先被reject失败状态的值。
Promise.race([p1, p2, p3])中只要有一个任务完成就得到结果,里面哪个结果获得的快,就返回那个结果,不管结果本身是成功状态还是失败状态。
与race类似,区别为any是首先拿到的成功任务将该结果返回,所有任务都不成功才返回失败,将多个 Promise 实例,包装成一个新的 Promise 实例
定义:当遇到异步函数执行的时候,将函数执行权转移出去,当异步函数执行完毕时再将执行权给转移回来
方法:yield表达式可以暂停函数执行,next方法用于恢复函数执行,这使得Generator函数可将异步任务按同步顺序来写,同时可以遍历对象
形式:function关键字与函数名之间有一个星号,函数体内部使用yield表达式,定义不同的内部状态
原理
定义:async/await是Generator 的语法糖,它是为优化then链的冗余书写效果而开发出来的
async
在function前添加关键字async,用于申明一个 异步的函数,其return的任何值都会被包装成promise对象
await:await 声明一个异步函数能延迟后面代码执行;await 可以用于等待一个 async 函数的返回值,await函数执行完后再将后面代码加入微任务队列
好处:以同步的方式书写来实现异步操作,避免了then的冗余书写;async/await可以通过try/catch来捕获错误更加高效
定义:闭包是指一个函数可以访问另一个函数作用域中的变量,即使该外部函数已经执行结束了,但是内部函数引用外部函数的变量依然保存在内存中
作用:
缺点:闭包会导致内存占用过高,因为变量都没有释放内存 造成内存泄漏使网页性能下降
应用场景
为何外部函数销毁了内部的函数仍能访问到变量
闭包函数的执行上下文维护了一个作用域链,即使创建它的上下文已经销毁,依然可以通过 f 函数的作用域链找到它
作用域
定义:变量(变量作用域又称上下文)和函数生效(能被访问)的区域
分类
作用域链
定义:如果在自己作用域找不到该变量就去父级作用域查找,依次向上级作用域查找,直到访问到window对象就被终止,这查找过程的链条就是作用域链
意义:通过作用域链,可以有序地访问到外层环境的变量和函数
定义:在代码之前之前会先预解析:创建一个全局执行上下文环境,先把代码中即将执行的变量、函数声明都拿出来,变量先赋值为undefined,函数先声明好可使用
类型
执行栈:用于存储在代码执行期间创建的所有执行上下文
全局变量的作用域为整个程序即可以在程序的任意位置访问;局部变量作用域只能在函数内部访问
全局变量存储在全局数据的堆区,局部变量存储在栈区
全局变量浏览器关闭才销毁,局部变量当程序执行完时就销毁更节约内存
在函数或花括号外部声明就是全局变量;直接给变量名赋值,在函数内部还是外部都是全局变量
var可以重复声明同一变量,后面声明的会覆盖前面的
let和const不能重复声明
var和let可不用设置初始值,后面可对变量重新赋值
const必须设置初始值且为常量,即不允许对该变量重新赋值
能用const的情况尽量使用const,其他情况下大多数使用let,避免使用var
const的的值可以修改吗
背景:浏览器的事件机制在触发时,会不断调用绑定在事件上的回调函数,极大地浪费资源;为了优化性能,需要对这类事件进行调用次数的限制,对此我们就可以采用 防抖 和 节流来减少调用频率
防抖
事件触发时延迟n 秒后再执行,若在 n 秒内被重复触发则重新计时,使得多次频繁触发只有最后一次生效,如防抖在连续的事件,只需触发一次回调的场景有输入结束后n秒才进行搜索请求,n秒内又输入的内容,就重新计时
节流
n 秒内只执行一次,触后n秒内将不能被再次触发,使得函数执行频率直接稀释,如节流在间隔一段时间执行一次回调的场景有搜索框的搜索联想功能
定义:继承可以使得子类具有父类别的各种属性和方法,而不需要再次编写相同的代码
方式
MVC
MVVM
定义:react是用于构建用户界面的js库,他把项目分成了各个独立的组件,这些组件可以相互组合或嵌套并且复用,使前端开发更高效和规范
特性
与真实dom区别
特点
过程
类组件:基于 ES6 Class 这种写法,通过继承 React.Component 得来的 React 组件;在里面可以写入状态、生命周期、构造函数(super调用父类的构造器,必须在this之前使用);但类组件内部的逻辑难以实现拆分和复用,this问题难以理解
函数组件: 只接受外部传来的数据即props进行展示,而没有自己的数据和状态;语法更短、更简单,这使得它更容易开发、理解和测试
两者区别
编写形式
类组件需要继承React.Component,要创建render来渲染逻辑并返回UI结构
函数式组件是一个纯函数,它是需要接受props参数并且返回一个React元素就可以了
调用方式
函数组件,调用则是执行函数即可
类组件要先实例化一个组件,然后调用实例对象的render方法创建组件
类组件有状态管理,而函数式组件的状态需要用hooks实现
业务逻辑
类组件是用生命周期函数来实现,而函数式组件使用react Hooks来实现
定义:高阶组件是一个函数,接收要包装的组件然后返回一个新的组件
实现方式:在高阶组件内部创建一个类组件,在类组件中提供状态复用
特点:主要功能是封装并分离组件的通用逻辑,让通用逻辑在组件间更好地被复用;但是需要在原组件上进行包裹或者嵌套,会影响代码的可读性
withRouter:不是所有组件都直接与路由相连(通过路由跳转到此组件)的,当这些组件需要路由参数时,使用withRouter就可以给此组件传入路由参数,将history、location、match三个对象传入props对象上,此时就可以使用this.props
作用
props和state区别
定义:React16新定义的一种数据结构 ,解决了由于js的单线程运行,遇到计算量较大的情况,导致动画和交互卡顿的问题
作用:优先级高的任务可以中断低优先级的任务。然后再重新优先级低的任务;增加了异步处理,通过调用requestIdleCallback api,浏览器空闲的时候再执行之前的暂停任务
原理:Fiber把渲染更新过程拆分成多个子任务,每次只做一小部分做完看是否还有剩余时间,如果有继续下一个任务;如果没有,挂起当前任务,将时间控制权交给主线程,等主线程不忙的时候在继续执行;dom diff树变成了链表,一个dom对应两个队列,这都是为找到被中断的任务重新执行
定义:类组件中render指的就是组件里的render方法;而在函数组件中,指的就是整个函数组件
原理:React 将新调用的 render函数返回的树与旧版本的树进行比较,然后进行 diff 比较更新 DOM树
触发时机
优化渲染 避免不必要render
原因:父组件一旦render渲染,子组件一定也会执行render渲染;子组件没有任何变化时也会重新渲染造成了性能浪费
方法
概念
调用原理:setState方法来告知react组件state已经发生了改变,当需要修改里面的值的状态需要通过调用setState来改变,从而达到更新组件内部数据的作用
setState调用之后发生了什么 ?是同步还是异步
在组件生命周期或React合成事件中,setState是异步的
定义:hook就是一个特殊的函数一般以use开头,hooks应用函数组件来为组件提供状态;hooks结合了类组件和函数组件各自的优点,为函数组件提供状态、生命周期等原本类组件才有的功能
作用
作用:声明并更新变量,为函数组件提供状态
参数:第一个为state初次渲染时是useState中传入的默认的值;第二个参数为更新state的函数
const [count,setCount]=useState(0)
它与类组件中声明state的区别是什么
为什么useState需要使用数组而不是对象
返回数组就可以直接按顺序解构可以对数组中的元素命名,使用起来更加方便;
useEffect
作用:处理函数中的副作用(除了根据数据渲染UI这一主作用外其余效果都是副作用,如Ajax请求、操作定时器,注册事件等)
参数:
useEffect(() => { document.title = `当前已点击 ${count} 次` }, [count])
useEffect和useLayoutEffect的区别?
useMemo和useCallBack
作用:这两个API都是通过缓存来优化组件的性能
参数:第一个为函数,第二个参数为数组作为依赖项,当函数再依赖项改变时才运行以避免很多额外开销
区别:
useMemo缓存的是回调函数中返回来的值,保存每次渲染时不会发生变化的值减少重复计算造成的资源浪费;useCallback缓存的是函数,在函数组件中只要state发生变化就会触发整个组件更新,而一些函数是没有必要更新的就应该缓存起来以提高性能
useRef
可以存储不需要引起页面渲染的数据
useContext
实现跨组件的数据传输
定义:类组件从产生到销毁的整个过程,包括从创建、初始化数据、更新数据、渲染页面、卸载等过程
三大阶段
作用:在不需要刷新页面的情况下就能切换到不同的页面,实现单页spa程序优化用户体验
两个Router组件都是作为容器组件包裹其他内容
两者区别
<BrowserRouter> <Switch> <Route exact path="/" component={HomePage} /> <Route path="/signIn" component={SignInPage} /> <Route path="/register" component={RegisterPage} /> <Route path="/detail/:touristRouteId" component={DetailPage} /> <Route render={() => <h1>404 not found 页面去火星了 !</h1>} /> </Switch> </BrowserRouter>
作用:
使用场景:
原理:把所有数据都放在store这一公共存储空间内,当某一组件改变了store里的数据,其他组件读去store的内容时也能共享到数据的变化,从而间接地实现数据传递
核心组成
核心API
Provider 组件:用来包裹整个 React 应用,接收 store 属性,为应用提供 state 和 操作 state 的方法
connect 函数:连接 Redux 和 React 组件,为被包裹的组件提供 state 和 操作 state 的方法。组件中通过 props 获取 Redux store 的内容
方法
http是基于请求-应答模式的,即为每次通信都要建立连接
请求报文
响应报文
响应行:由网络协议版本,状态码和状态码的原因短语组成,例如 HTTP/1.1 200 OK
响应体:服务器响应的数据
基于udp协议但还保证了安全性,结合了tcp和udp各自的优点,这套功能被称为QUIC协议。
超文本安全传输协议,相比于http通信它增加了SSL/TLS安全层来加密数据包
作用:提供身份认证、信息加密等功能以避免http在明文传输过程中被劫持篡改的风险,他会对发起的http加密和对接收的http请求解密
工作原理(保证安全的方法):
背景
非对称加密也不一定能保证安全,因为并不能保证公钥就一定是安全的,可能会被中间人窃取了公钥并调包成恶意公钥,当使用这个恶意公钥加密信息时就可能被恶意方的私钥解密;所以要引入公信力高的第三方(CA)颁发证书证明身份,防止被中间人攻击
原理
在tcp三次握手后还要进行SSL/TLS四次握手才能建立连接
定义:将域名解析为服务器IP地址的协议,使得我们通过输入域名就能访问到对应IP地址的网站
DNS是基于什么协议的
DNS解析过程(工作原理)
背景:当网络需求资源超过可用资源时,资源供应不足网络性能就要变坏,所以需要维护一个动态变化的拥塞窗口控制网络的拥塞程度
控制方法
定义:接收方让发送方的速度不要太快,要让接收方来得及接收
控制方法——滑动窗口
通过窗口大小控制能接收的数据量(注意区分和滑动窗口协议的区别),,让发送方的发送窗口不能超过接收方的接收窗口大小
原则:发送方发送数据前都要等待应答才能继续发送,接收方收到数据后都要反馈应答才能继续下一帧
重传机制
建立一个tcp连接时,需要客户端和服务器总共发送三个包,以确认双方的发送能力和接收能力都正常
握手过程
为何不是两次握手
确认双方的接收能力和发送能力都正常,让服务器能知道自己的序号得到确认
防止失效的请求报文被服务器接收造成服务器开启无用的连接而使资源浪费:如果客户端发出的连接请求因网络延迟而滞留,在超时后客户端就会重发第二个请求与服务端建立连接;当该连接释放时,第一个滞留的连接请求可能又传到了服务端,而服务端又认为这是一个新的连接请求,在没有客户端最后发来的确认下就建立了连接,客户端此时本不需要发送数据而服务器又会一直等待其发送数据,造成不必要的性能消耗
为什么需要四次
tcp连接是全双工信道,需要双方分别释放到对方的连接,单独一方的连接释放只代表不能再向对方发送数据,连接处于的是半释放的状态。
为何要等待一段时间再关闭
等待2msl后连接彻底关闭 ;2MSL是一个发送和回复所需的最大时间,确保TCP连接断开的可靠性;防止发送给服务器的确认报文段丢失或者出错,从而导致服务器端不能正常关闭
定义:是一种位于应用层的网络传输协议。可在单个TCP连接上进行全双工通信,能更好的节省服务器资源并达到实时通迅;客户端和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输
优点:
适用场景:视频弹幕、直播等实时性强的场景
原理:发送端从应用层开始向下传递对数据每层都添加封装,接收端再从物理层开始依次解封装最后得到数据
定义:浏览器将加载过的静态资源存储到本地中,如果静态资源没有更新则当浏览器再次请求时就可以直接从本地读取而不必再向服务器发出请求
好处:减少了向服务器发起的多余请求,从而减轻服务器负担提高了网站性能,同时加快了用户在网页的加载速度
强缓存
定义:强缓存是指不必向服务器发起请求就可直接使用的本地缓存资源
设置方式(header字段)
协商缓存
当没有命中强缓存时就会使用协商缓存,先向服务器发出请求,如果资源没有更改则返回304状态码,浏览器获取到本地缓存;如果资源已经修改则返回修改后的资源
设置方式
针对js
原因:js会阻塞css和HTML的解析,所有浏览器在下载js文件时都会组织一切其他活动,直到js解析执行完才继续从中断的地方恢复解析(为避免js的操作可能会删除dom,造成浏览器资源的浪费刚解析的dom就又被js删除,所以干脆将dom解析放在js执行完后)
为了提高页面加载速度就要让页面延迟加载:
针对css
css对渲染的影响:
优化方法
针对dom树和css树
定义
减少回流和重绘的方法
cookie:一种纯文本文件,每次http请求都会携带cookie,用于存储用户的数据信息以便让服务器辨别用户身份
组成
特性
使用场景:将sessionid存储到cookie中,每次请求都会携带这个sessionId,让服务器知道是谁发起的请求
怎么能防止cookie被窃取呢?
通过配置cookie的:Secure / HttpOnly
Secure属性指定浏览器只有在加密协议 HTTPS 下,才能将这个 Cookie 发送到服务器。另一方面,如果当前协议是 HTTP,浏览器会自动忽略服务器发来的Secure属性。该属性只是一个开关,不需要指定值。如果通信是 HTTPS 协议,该开关自动打开。
HttpOnly属性指定该 Cookie 无法通过 JavaScript 脚本拿到,主要是Document.cookie属性、XMLHttpRequest对象和 Request API 都拿不到该属性。这样就防止了该 Cookie 被脚本读到,只有浏览器发出 HTTP 请求时,才会带上该 Cookie。
cookie能跨域携带吗?
session:是一个存储信息的对象,用于保存用户状态;服务器会为每个浏览器创建唯一的sessionID并保存在cookie做为客户端与服务器的验证标识
作用:服务器收到客户端请求要产生一个session时,会先检查客户端的cookies中是否有sessionId,并且判断它是否过期;sessionId且还没有过期,则会根据该sessionId的值将服务器中的session检索出来;否则,将产生一个新的session,当创建一个新session后,服务器也会产生一个sessionId号,回写到客户端的cookies当中。
cookie和session的区别
LocalStorage
优点:
特点:当前窗口关闭后就失效了,并且只能被同一个窗口的同源页面所访问共享
SessionStorage
定义:本地存储会话(session)中的数据,主要用于临时保存同一窗口(或标签页)的数据,关闭窗口或标签页之后将会删除这些数据
特点:这些数据只有在同一个会话当中的页面才可以访问(页面刷新不会导致数据丢失),当页面管壁后数据才跟着销毁
IndexedDB
浏览器提供的本地数据库,可以被网页脚本创建和操作,允许存贮大量数据,提供查找能建立索引
特点
同源策略
cors
定义:发起跨域请求时使用额外的http头,让浏览器允许不同源服务器上指定资源的访问
请求分类:
jsonp
script标签不受同源策略限制,可以直接引用外部资源即通过src属性请求非同源的script脚本,只支持GET请求且不安全,可能遇到XSS攻击
开发阶段配置webpack的proxy :
Nginx配置反向代理: 生产环境部署时用的nginx Nginx 是一种高性能的反向代理服务器,反向代理即帮其它的服务器拿到请求,然后选择一个合适的服务器,将请求转交给它,实现服务器集群的负载均衡。在配置文件的http块下的server块中,删除/注释掉 location / 下的内容,配置成项目运行的地址,再添加 location /api 配置此时的配置内容意思为,将http://127.0.0.1:8080和http://127.0.0.1:9090都代理到localhost:8000地址下,这样就不会有跨域
WebSocket
请求头信息中有Origin字段,表示请求源来自哪个域,服务器可以根据这个字段判断是否允许本次通信,如果在白名单内,就可以通信
事件定义:事件是用户操作网页时发生的交互动作如鼠标点击移动或者网页本身的一些操作。事件被封装成一个event对象,包含了属性和方法
事件触发过程(事件流)
阻止事件冒泡:event.stopPropagation()方法
事件委托/事件代理:把原本需要绑定在子元素的响应事件通过冒泡机制委托给父元素,父节点捕获到事件后再进行处理
好处:大量节省内存占用,减少事件注册
定义:跨站脚本攻击,攻击者在页面里插入了恶意script代码
攻击类型
防御
不需要注入恶意代码而是伪造用户请求,在用户不知情时借用户名义做出恶意行为
攻击类型
攻击的必要条件:目标站点一定要有 CSRF 漏洞;用户要登录过目标站点,并且在浏览器上保持有该站点的登录状态;需要用户打开一个第三方网站
防御策略
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。