Web前端面试题汇总
1.说一下http和https
- http和https的基本概念
http: 超文本传输协议,是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
https: 是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
https协议的主要作用是:建立一个信息安全通道,来确保数组的传输,确保网站的真实性。
- http和https的区别
http传输的数据都是未加密的,也就是明文的,网景公司设置了SSL协议来对http协议传输的数据进行加密处理,简单来说https协议是由http和ssl协议构建的可进行加密传输和身份认证的网络协议,比http协议的安全性更高。
主要的区别如下:
- Https协议需要ca证书,费用较高。
- http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
- 使用不同的链接方式,端口也不同,一般而言,http协议的端口为80,https的端口为443
- http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
- 默认HTTP的端口号为80,HTTPS的端口号为443。
https协议的优点
- 使用HTTPS协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;
- HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。
- HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。
https协议的缺点
- https握手阶段比较费时,会使页面加载时间延长50%,增加10%~20%的耗电。
- https缓存不如http高效,会增加数据开销。
- SSL证书也需要钱,功能越强大的证书费用越高。
2.TCP传输的三次握手四次挥手策略
三次握手
为了准确无误地把数据送达目标处,TCP协议采用了三次握手策略。用TCP协议把数据包送出去后,TCP不会对传送 后的情况置之不理,它一定会向对方确认是否成功送达。握手过程中使用了TCP的标志:SYN和ACK。
- 发送端首先发送一个带SYN标志的数据包给对方。
- 接收端收到后,回传一个带有SYN/ACK标志的数据包以示传达确认信息。
- 最后,发送端再回传一个带ACK标志的数据包,代表“握手”结束。
(若在握手过程中某个阶段莫名中断,TCP协议会再次以相同的顺序发送相同的数据包)
四次挥手
断开一个TCP连接则需要“四次握手”
- 第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不 会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可 以接受数据。
- 第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
- 第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
- 第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。
3.TCP和UDP的区别
- TCP是面向连接的,udp是无连接的即发送数据前不需要先建立链接。
- TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。 并且因为tcp可靠,面向连接,不会丢失数据因此适合大数据量的交换。
- TCP是面向字节流,UDP面向报文,并且网络出现拥塞不会使得发送速率降低(因此会出现丢包,对实时的应用比如IP电话和视频会议等)。
- TCP只能是1对1的,UDP支持1对1,1对多。
- TCP的首部较大为20字节,而UDP只有8字节。
- TCP是面向连接的可靠性传输,而UDP是不可靠的。
4.创建ajax过程
- 创建XMLHttpRequest对象,也就是创建一个异步调用对象.
- 创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息.
- 设置响应HTTP请求状态变化的函数.
- 发送HTTP请求.
- 获取异步调用返回的数据.
- 使用JavaScript和DOM实现局部刷新.
5.WebSocket的实现和应用
WebSocket是HTML5中的协议,支持持久连续,http协议不支持持久性连接。Http1.0和HTTP1.1都不支持持久性的链接,HTTP1.1中的keep-alive,将多个http请求合并为1个
WebSocket的优点
HTTP的生命周期通过Request来界定,也就是Request一个Response,那么在Http1.0协议中,这次Http请求就结束了。在Http1.1中进行了改进,是的有一个connection:Keep-alive,也就是说,在一个Http连接中,可以发送多个Request,接收多个Response。但是必须记住,在Http中一个Request只能对应有一个Response,而且这个Response是被动的,不能主动发起。
6.HTML5 drag api
拖放元素,是一个可拖放元素,img和a默认可拖放,其他元素可设置
draggable = "true"
- dragstart 拖放开始
- drag 正在拖放
- dragend 拖放结束
目标元素,放置拖放元素,设置可放置的目标元素
- dragenter 进入目标元素
- dragover 在目标元素内部活动 ----
event.preventDefault() 阻止默认行为- drop 将拖放元素放置在目标元素内部 ----
event.stopPropagation() 阻止冒泡
拖放事件生命周期
dragstart-->drag-->dragenter-->dragover-->drop-->dragend
7.HTTP状态码分类
HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。
HTTP状态码共分为5种类型:
1**信息,服务器收到请求,需要请求者继续执行操作2**信息,成功,操作被成功接收并处理3**重定向,需要进一步的操作以完成请求4**客户端错误,请求包含语法错误或无法完成请求5**服务器错误,服务器在处理请求的过程中发生了错误
8.Cookie、sessionStorage、localStorage的区别
共同点:都是保存在浏览器端,并且是同源的。
- cookie数据始终在同源的http请求中携带(即使不需要),即cookie在浏览器和服务器间来回传递
- cookie数据还有路径(path)的概念,可以限制。cookie只属于某个路径下
- 存储大小限制也不同,cookie数据不能超过4K,同时因为每次http请求都会携带cookie,所以cookie只适合保存很小的数据,如回话标识。
- webStorage虽然也有存储大小的限制,但是比cookie大得多,可以达到5M或更大
- 数据的有效期不同sessionStorage:仅在当前的浏览器窗口关闭有效;localStorage:始终有效,窗口或浏览器关闭也一直保存,因此用作持久数据;cookie:只在设置的cookie过期时间之前一直有效,即使窗口和浏览器关闭
- 作用域不同sessionStorage:不在不同的浏览器窗口中共享,即使是同一个页面;localStorage:在所有同源窗口都是共享的;cookie:也是在所有同源窗口中共享的
9.说一下web worker
在HTML页面中,如果在执行脚本时,页面的状态是不可相应的,直到脚本执行完成后,页面才变成可相应。web worker是运行在后台的js,独立于其他脚本,不会影响页面你的性能。并且通过postMessage将结果回传到主线程。这样在进行复杂操作的时候,就不会阻塞主线程了。
worker主线程:
- 通过 worker = new Worker( url ) 加载一个JS文件来创建一个worker,同时返回一个worker实例。
- 通过worker.postMessage( data) 方法来向worker发送数据。
- 绑定worker.onmessage方法来接收worker发送过来的数据。
- 可以使用 worker.terminate() 来终止一个worker的执行。
10.iframe是什么?有什么优缺点?
定义:iframe元素会创建包含另一个文档的内联框架
优点:
- 解决加载缓慢的第三方内容如图标和广告等的加载问题
- iframe无刷新文件上传
- iframe跨域通信
缺点:- 会阻塞主页面的onload事件
- 搜索引擎无法解读这种页面,不利于SEO
- 页面会增加服务器的http请求
- iframe和主页面共享连接池,而浏览器对相同区域有限制所以会影响性能。
11.Doctype作用?严格模式与混杂模式如何区分?它们有何意义?
Doctype声明于文档最前面,告诉浏览器以何种方式来渲染页面,这里有两种模式,严格模式和混杂模式。
严格模式的排版和JS 运作模式是 以该浏览器支持的最高标准运行。
混杂模式,向后兼容,模拟老式浏览器,防止浏览器无法兼容页面。
12.XSS与CSRF有什么区别吗?
XSS是获取信息,不需要提前知道其他用户页面的代码和数据包。
CSRF是代替用户完成指定的动作,需要知道其他用户页面的代码和数据包。
CSRF的防御
- 服务端的CSRF方式方法很多样,但总的思想都是一致的,就是在客户端页面增加伪随机数。
- 通过验证码的方法
13.cookie session区别
- cookie数据存放在客户的浏览器上,session数据放在服务器上。
- cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。- 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
14.前端优化
- 降低请求量:合并资源,减少HTTP 请求数,minify / gzip 压缩,webP,lazyLoad。
- 加快请求速度:预解析DNS,减少域名数,并行加载,CDN 分发。
- 缓存:HTTP 协议缓存请求,离线缓存 manifest,离线数据缓存localStorage。
- 渲染:JS/CSS优化,加载顺序,服务端渲染,pipeline。
- 减少DOM操作次数
- 合并样式和脚本,使用css图片精灵
15.GET和POST的区别
- get参数通过url传递,post放在request body中。
- get请求在url中传递的参数是有长度限制的,而post没有。
- get比post更不安全,因为参数直接暴露在url中,所以不能用来传递敏感信息。
- get请求只能进行url编码,而post支持多种编码方式
- get请求会浏览器主动cache,而post支持多种编码方式。
- get请求参数会被完整保留在浏览历史记录里,而post中的参数不会被保留。
- GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
- GET产生一个TCP数据包;POST产生两个TCP数据包。
16.HTTP支持的方法
GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE, CONNECT
17. 说一下浏览器缓存
缓存分为两种:强缓存和协商缓存,根据响应的header内容来决定。
- 强缓存相关字段有expires,cache-control。如果cache-control与expires同时存在的话,cache-control的优先级高于expires。
- 协商缓存相关字段有Last-Modified/If-Modified-Since,Etag/If-None-Match
18.HTML5新增的元素
- 标签增删
- canvas绘图,支持内联SVG。支持MathML
- 多媒体audio video source embed track
- 本地离线存储,把需要离线存储在本地的文件列在一个manifest配置文件
- web存储。localStorage、SessionStorage
19.CSS3新特性
圆角(border-radius),阴影(box-shadow),文本阴影(text-shadow),线性渐变(gradient),旋转(transform), 变形(transform),translate(移动 长度值或百分数值),scale(缩放 数值),rotate(旋转 角度),skew(倾斜 角度),opacity,rgba(),hsla(),word-wrap,background-image,background-origin,border-image,font-face,selection(伪元素),媒体查询,多栏布局。
20.javascript对象的几种创建方式
- 工厂模式
- 构造函数模式
- 原型模式
- 混合构造函数和原型模式
- 动态原型模式
- 寄生构造函数模式
- 稳妥构造函数模式
21.javascript继承的6种方法
- 原型链继承,将父类的实例作为子类的原型,他的特点是实例是子类的实例也是父类的实例,父类新增的原型方法/属性,子类都能够访问,并且原型链继承简单易于实现,缺点是来自原型对象的所有属性被所有实例共享,无法实现多继承,无法向父类构造函数传参。
- 构造继承,使用父类的构造函数来增强子类实例,即复制父类的实例属性给子类,构造继承可以向父类传递参数,可以实现多继承,通过call多个父类对象。但是构造继承只能继承父类的实例属性和方法,不能继承原型属性和方法,无法实现函数服用,每个子类都有父类实例函数的副本,影响性能。
- 实例继承,为父类实例添加新特性,作为子类实例返回,实例继承的特点是不限制调用方法,不管是new 子类()还是子类()返回的对象具有相同的效果,缺点是实例是父类的实例,不是子类的实例,不支持多继承。
- 拷贝继承:特点:支持多继承,缺点:效率较低,内存占用高(因为要拷贝父类的属性)无法获取父类不可枚举的方法(不可枚举方法,不能使用for in 访问到)。
- 组合继承:通过调用父类构造,继承父类的属性并保留传参的优点,然后通过将父类实例作为子类原型,实现函数复用。
- 寄生组合继承:通过寄生方式,砍掉父类的实例属性,这样,在调用两次父类的构造的时候,就不会初始化两次实例方法/属性,避免的组合继承的缺点。
22.页面导入样式时,使用link和@import有什么区别
- 本质的差别:link属于XHTML标签,而@import完全是CSS提供的一种方式。
- 加载顺序的差别:当一个页面被加载的时候(就是被浏览者浏览的时候),link引用的CSS会同时被加载,而@import引用的CSS会等到页面全部被下载完再被加载。
- 兼容性的差别:@import是CSS2.1提出的,所以老的浏览器不支持,@import只有在IE5以上的才能识别,而link标签无此问题。
- 使用dom控制样式时的差别:当使用javascript控制dom去改变样式的时候,只能使用link标签,因为@import不是dom可以控制的.
23.HTML与XHTML二者有什么区别?
- HTML 元素必须被正确地嵌套。
- XHTML 元素必须被关闭。
- 标签名必须用小写字母。
- XHTML文档必须拥有根元素。
24.简述一下你对HTML语义化的理解
- 用正确的标签做正确的事情。
- html语义化让页面的内容结构化,结构更清晰,便于对浏览器,搜索引擎解析;
- 即使在没有样式CSS情况下也以一种文档格式显示,并且是容易阅读的;
- 搜索引擎的爬虫也依赖于HTML标记确定上下文和各个关键字的权重,利用SEO;
- 使阅读源代码的人对网站更容易将网站分块,便于阅读维护理解。
25.position的值
- absolute 生成绝对定位的元素, 相对于最近一级的 定位不是 static 的父元素来进行定位。
- relative 生成相对定位的元素,相对于其在普通流中的位置进行定位。
- fixed (老IE不支持)生成绝对定位的元素,通常相对于浏览器窗口或 frame 进行定位。
- static 默认值。没有定位,元素出现在正常的流中
- sticky 生成粘性定位的元素,容器的位置根据正常文档流计算得出
- inherit 规定应该从父元素继承position 属性的值
26.如何解决跨域问题
跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。
- 使用spring拦截器解决跨域问题
- nginx 转发
- JSONP
原理是:动态插入script标签,通过script标签引入一个js文件,这个js文件载入成功后会执行我们在url参数中指定的函数,并且会把我们需要的json数据作为参数传入。(由于 script 标签不受浏览器同源策略的影响,允许跨域引用资源。因此可以通过动态创建 script 标签,然后利用 src 属性进行跨域,这也就是 JSONP 跨域的基本原理)- CORS(跨域资源共享),服务端设置Access-Control-Allow-Origin即可,前端无须设置,若要带cookie请求,前后端都需要设置。
- 服务器代理,启一个代理服务器,实现数据的转发,浏览器有跨域限制,但是服务器不存在跨域问题,所以可以由服务器请求所要域的资源再返回给客户端。
- document.domain 跨域
- window.name + iframe跨域:通过iframe的src属性由外域转向本地域,跨域数据即由iframe的window.name从外域传递到本地域。
- location.hash + iframe跨域:a欲与b跨域相互通信,通过中间页c来实现。 三个页面,不同域之间利用iframe的location.hash传值,相同域之间直接js访问来通信。
- postMessage跨域:可以跨域操作的window属性之一。
27.同源策略
同源策略是客户端脚本的重要安全度量标准。目的是防止某个文档或脚本从多个不同的源装载,是用于隔离潜在恶意文件的重要安全机制。
同源定义: 域名(Host)、端口(Port)、协议(Protocol)
28.XML和JSON的区别
- 数据体积方面:JSON相对于XML来讲,数据的体积小,传递的速度更快些。
- 数据交互方面:JSON与JavaScript的交互更加方便,更容易解析处理,更好的数据交互。
- 数据描述方面:JSON对数据的描述性比XML较差。
- 传输速度方面:JSON的速度要远远快于XML。
29.谈谈你对webpack的看法
WebPack 是一个模块打包工具,你可以使用WebPack管理你的模块依赖,并编绎输出模块们所需的静态文件。它能够很好地管理、打包Web开发中所用到的HTML、JavaScript、CSS以及各种静态文件(图片、字体等),让开发过程更加高效。
webpack的两大特色:
- code splitting(可以自动完成)
- loader 可以处理各种类型的静态文件,并且支持串联操作
webpack具有requireJs和browserify的功能,但仍有很多自己的新特性:
- 对 CommonJS 、 AMD、ES6的语法做了兼容
- 对js、css、图片等资源文件都支持打包
- 有独立的配置文件webpack.config.js
- 串联式模块加载器以及插件机制,让其具有更好的灵活性和扩展性,例如提供对CoffeeScript、ES6的支持
- 可以将代码切割成不同的chunk,实现按需加载,降低了初始化时间
- 支持 SourceUrls 和SourceMaps,易于调试
- 具有强大的Plugin接口,大多是内部插件,使用起来比较灵活
- webpack 使用异步 IO 并具有多级缓存。这使得 webpack 很快且在增量编译上更加快
30.渐进增强和优雅降级
渐进增强 :针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。
优雅降级 :一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。
31. 输入URL到页面加载显示完成发生了什么?
- DNS解析
- TCP连接
- 发送HTTP请求
- 服务器处理请求并返回HTTP报文
- 浏览器解析渲染页面
- 连接结束
32.css盒模型
标准盒子模型
标准盒子模型的盒子宽度:左右border+左右padding+width
IE盒子模型
IE盒子模型的盒子宽度:width
在CSS3中引入了box-sizing属性,box-sizing:content-box;表示标准的盒子模型,box-sizing:border-box表示的是IE盒子模型
区别:从图中我们可以看出,这两种盒子模型最主要的区别就是width的包含范围,在标准的盒子模型中,width指content部分的宽度,在IE盒子模型中,width表示content+padding+border这三个部分的宽度,故这使得在计算整个盒子的宽度时存在着差异:
33.BFC
**BFC全称为块格式化上下文 (Block Formatting Context) **
直译成:块级格式化上下文,是一个独立的渲染区域,并且有一定的布局规则。
- 用于清楚浮动,防止margin重叠,自适应的两栏布局等
- BFC区域不会与float box重叠
- BFC是页面上的一个独立容器,子元素不会影响到外面
34.垂直居中的方法
- margin:auto法
position: absolute;
margin: auto;
top: 0;
left: 0;
right: 0;
bottom: 0;
- margin负值法
position: absolute;
top: 50%;
left: 50%;
margin-top: -100px; /*父元素height的一半*/
margin-left: -100px; /*父元素width的一半*/
- transform变形
position: absolute;
top: 50%;
left: 50%;
transform:translateX(-50%);
transform:translateY(-50%);
/*可以合起来写 transform: translate(-50%, -50%); */
- table-cell(未脱离文档流的)
display: table-cell;
vertical-align: middle;
text-align: center;
- 利用flex
display: flex;
align-items: center;
justify-content: center;
- calc计算位置
position: absolute;
left:calc((父元素的宽 - 子元素的宽)/2)
top:calc((父元素的高 - 子元素的高)/2)
35.怎么清除浮动
- 使用带clear属性的空元素
在浮动元素后使用一个空元素如,并在CSS中赋予.clear{clear:both;}属性即可清理浮动。亦可使用或来进行清理。- 使用CSS的overflow属性
给浮动元素的容器添加overflow:hidden;或overflow:auto;可以清除浮动,另外在 IE6 中还需要触发 hasLayout ,例如为父元素设置容器宽高或设置 zoom:1。在添加overflow属性后,浮动元素又回到了容器层,把容器高度撑起,达到了清理浮动的效果。- 给浮动的元素的容器添加浮动
给浮动元素的容器也添加上浮动属性即可清除内部浮动,但是这样会使其整体浮动,影响布局,不推荐使用。- 使用邻接元素处理
什么都不做,给浮动元素后面的元素添加clear属性。- 使用CSS的:after伪元素
结合:after 伪元素(注意这不是伪类,而是伪元素,代表一个元素之后最近的元素)和 IEhack ,可以完美兼容当前主流的各大浏览器,这里的 IEhack 指的是触发 hasLayout。给浮动元素的容器添加一个clearfix的class,然后给这个class添加一个:after伪元素实现元素末尾添加一个看不见的块元素(Block element)清理浮动。
36.回流和重绘
回流(Reflow):当Render Tree中部分或全部元素的尺寸、结构、或某些属性发生改变时,浏览器重新渲染部分或全部文档的过程称为回流。
会导致回流的操作:
- 页面首次渲染
- 浏览器窗口大小发生改变
- 元素尺寸或位置发生改变
- 元素内容变化(文字数量或图片大小等等)
- 元素字体大小变化
- 添加或者删除可见的DOM元素
- 激活CSS伪类(例如
:hover)- 查询某些属性或调用某些方法,包括offsetLeft、offsetTop、offsetWidth、offsetHeight、scrollTop/Left/Width/Height、clientTop/Left/Width/Height、调用了getComputedStyle()或者IE的currentStyle时,浏览器为了返回最新值,会触发回流。
重绘 (Repaint):当页面中元素样式的改变并不影响它在文档流中的位置时(例如:color、background-color、visibility等),浏览器会将新样式赋予给元素并重新绘制它,这个过程称为重绘。
- reflow回流必定引起repaint重绘,重绘可以单独触发
- 背景色、颜色、字体改变(注意:字体大小发生变化时,会触发回流)
性能影响:回流比重绘的代价要更高。
有时即使仅仅回流一个单一的元素,它的父元素以及任何跟随它的元素也会产生回流。
优化渲染性能,减少回流和重绘
- 尽量避免改变布局属性。如width, height, left, top。
- 除了transforms 或者 opacity属性都会引起重绘,做动画的时候要注意,尽量使用这两个属性;
- 使用Flexbox。
- 避免多次读取部分布局属性(同上)
- 将复杂的节点元素脱离文档流,降低回流成本
37.使元素消失的方法有哪些?
- opacity:0,该元素隐藏起来了,但不会改变页面布局,并且,如果该元素已经绑定一些事件,如click事件,那么点击该区域,也能触发点击事件的。(保留占据的空间)
- visibility:hidden,该元素隐藏起来了,但不会改变页面布局,但是不会触发该元素已经绑定的事件。(保留占据的空间)
- display:none,把元素隐藏起来,并且会改变页面布局,可以理解成在页面中把该元素删除掉。 (元素原来占据的空间位置不保留; 产生回流和重绘。)
38.常用的布局
固宽布局:各个模块是固定宽度
特点:设计简单,不会受到图片等固定宽度内容的影响。对比高分辨率的用户,固定宽度会留下很多空白,屏幕小出现滚动条。流动布局:使用百分比的方式自适应不同的分辨率
特点:对用户友好,能够部分自适应用户的设置。网页周围的空白区域在所有分辨率和显示器下都是相同,视觉上美观。设计者需要进行不同的测试,准备不同的对应素材弹性布局:使用em作为单位,em是相对单位,随用户字体大小变化而改变
特点:页面中所有元素可以随着用户的偏好缩放,需要花更多的事件测试,让布局适合所有的用户栅格化布局:也分为固定式栅格,流式栅格
在网页设计中,我们把宽度为“W”的页面分割成n个网格单元“a”,每个单元与单元之间的间隙设为“i”,此时我们把“a+i”定义“A”。他们之间的关系如下:W =(a*n)+(n-1)*I,由于a+i=A,因此可得:(A×n) – i = W。注:最左右边没有边距(margin-left,marign-right)。
特点:可以提高网页的规范性和可用性。在栅格系统下,页面模块的尺寸标准化。整个网站的各个页面布局一致,增加页面的相似度。响应式布局
允许页面宽度自动调整,利用媒体查询根据不同的宽度设置不同的样式,液态布局,自适应媒体(图片,视频)。
39.css布局
圣杯布局是指布局从上到下分为header、container、footer,然后container部分定为三栏布局。这种布局方式同样分为header、container、footer。圣杯布局的缺陷在于 center 是在 container 的padding中的,因此宽度小的时候会出现混乱。双飞翼布局给center 部分包裹了一个 main 通过设置margin主动地把页面撑开。Flex布局是由CSS3提供的一种方便的布局方式。绝对定位布局是给container 设置position: relative和overflow: hidden,因为绝对定位的元素的参照物为第一个postion不为static的祖先元素。 left 向左浮动,right 向右浮动。center 使用绝对定位,通过设置left和right并把两边撑开。 center 设置top: 0和bottom: 0使其高度撑开。表格布局的好处是能使三栏的高度统一。网格布局可能是最强大的布局方式了,使用起来极其方便,但目前而言,兼容性并不好。网格布局,可以将页面分割成多个区域,或者用来定义内部元素的大小,位置,图层关系。
40.说一下事件委托
事件委托指的是,不在事件的发生地(直接dom)上设置监听函数,而是在其父元素上设置监听函数,通过事件冒泡,父元素可以监听到子元素上事件的触发,通过判断事件发生元素DOM的类型,来做出不同的响应。
举例:最经典的就是ul和li标签的事件监听,比如我们在添加事件时候,采用事件委托机制,不会在li标签上直接添加,而是在ul父元素上添加。
好处:比较合适动态元素的绑定,新添加的子元素也会有监听函数,也可以有事件触发机制。
41.图片的懒加载和预加载
预加载:就是在网页全部加载之前,提前加载图片,当用户需要查看时可直接从本地缓存中渲染,以提供给用户更好的体验,减少等待的时间。
预加载方法
- 使用css背景图片
- 使用JavaScript配合css背景图片
- 用JavaScript创建图片
- 使用Ajax
懒加载:懒加载的主要目的是作为服务器前端的优化,减少请求数或延迟请求数。延迟加载图片或符合某些条件时才加载某些图片。
懒加载方法
- 使用定时器或者计时器
- 条件加载
- 可视区域加载
两种技术的本质:两者的行为是相反的,一个是提前加载,一个是迟缓甚至不加载。懒加载对服务器前端有一定的缓解压力作用,预加载则会增加服务器前端压力。
42.js的new操作符做了哪些事情
- 创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。
- 属性和方法被加入到 this 引用的对象中。
- 新创建的对象由 this 所引用,并且最后隐式的返回 this 。
43.改变函数内部this指针的指向函数(bind,apply,call的区别)
通过apply和call改变函数的this指向,他们两个函数的第一个参数都是一样的表示要改变指向的那个对象,第二个参数,apply是数组,而call则是arg1,arg2…(参数列表)这种形式。通过bind改变this作用域会返回一个新的函数,这个函数不会马上执行。
44.js的各种位置,比如clientHeight,scrollHeight,offsetHeight ,以及scrollTop, offsetTop,clientTop的区别?
- clientHeight:表示的是可视区域的高度,不包含border和滚动条
- offsetHeight:表示可视区域的高度,包含了border和滚动条
- scrollHeight:表示了所有区域的高度,包含了因为滚动被隐藏的部分。
- clientTop:表示边框border的厚度,在未指定的情况下一般为0
- scrollTop:滚动后被隐藏的高度,获取对象相对于由offsetParent属性指定的父坐标(css定位的元素或body元素)距离顶端的高度。
45.异步加载js的方法
defer:只支持IE如果您的脚本不会改变文档的内容,可将 defer 属性加入到
标签中,以便加快处理文档的速度。因为浏览器知道它将能够安全地读取文档的剩余部分而不用执行脚本,它将推迟对脚本的解释,直到文档已经显示给用户为止。
- async,HTML5属性仅适用于外部脚本,并且如果在IE中,同时存在defer和async,那么defer的优先级比较高,脚本将在页面完成时执行。
- 创建script标签,插入到DOM中
- 按需异步载入js
46.说一下闭包
闭包:指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分(通俗的讲:就是函数a的内部函数b,被函数a外部的一个变量引用的时候,就创建了一个闭包)
闭包的特点:
- 封闭性:外界无法访问闭包内部的数据,如果在闭包内声明变量,外界是无法访问的,除非闭包主动向外界提供访问接口
- 持久性:一般的函数,调用完毕之后,系统自动注销函数,而对于闭包来说,在外部函数被调用之后,闭包结构依然保存在
闭包三个特性:
- 函数嵌套函数。
- 函数内部可以引用外部的参数和变量。
- 参数和变量不会被垃圾回收机制回收。
闭包的优点:
- 让一个变量长期驻扎在内存当中(不被垃圾回收机制回收)
- 避免全局变量的污染
- 私有成员的存在
- 安全性提高
闭包的缺点:
- 常驻内存,增加内存使用量。
- 使用不当会很容易造成内存泄露。
47.防抖(Debouncing)和节流(Throttling)
防抖技术:即是可以把多个顺序地调用合并成一次,也就是在一定时间内,规定事件被触发的次数。防抖是每次想要执行这个函数,都得先等上一段时间。
节流技术:可以理解为事件在一个管道中传输,加上这个节流阀以后,事件的流速就会减慢。节流是在一定的时间段内,函数最多可以被调用多少次。也可以理解为函数以一定的频率被调用。
48.数组去重
- indexOf循环去重
- ES6 Set去重;Array.from(new Set(array))
- Object 键值对去重;把数组的值存成 Object 的 key 值,比如 Object[value1] = true,在判断另一个值的时候,如果 Object[value2]存在的话,就说明该值是重复的。
49.去除字符串中的空格
- 去除所有空格
str = str.replace(/\s+/g,"");
- 去除两头空格
str = str.replace(/^\s+|\s+$/g,"");
- 去除左空格
str=str.replace( /^\s/, '');
- 去除右空格
str=str.replace(/\s$/g, "");
50.如何判断一个数组
- 使用instanceof方法
var arr=[];
console.log(arr instanceof Array) //true
- 使用constructor方法
console.log([].constructor == Array); //true
- 使用Object.prototype.toString.call(arr) === [object Array] 方法
var arr=[];
console.log(Object.prototype.toString.call(arr) === [object Array]); //true
- 使用Array.isArray方法
var arr=[];
console.log(Array.isArray(arr)) //true
51.this的指向哪几种
- 默认绑定:全局环境中,this默认绑定到window。
- 隐式绑定:一般地,被直接对象所包含的函数调用时,也称为方法调用,this隐式绑定到该直接对象。
- 隐式丢失:隐式丢失是指被隐式绑定的函数丢失绑定对象,从而默认绑定到window。显式绑定:通过call()、apply()、bind()方法把对象绑定到this上,叫做显式绑定。
- new绑定:如果函数或者方法调用之前带有关键字new,它就构成构造函数调用。对于this绑定来说,称为new绑定。
52. 介绍一下promise
promise的状态:等待(pending)、已完成(fulfilled)、已拒绝(rejected)
Promise是一个对象,保存着未来将要结束的事件,有两个特征:
- 对象的状态不受外部影响,Promise对象代表一个异步操作,有三种状态,pending进行中,fulfilled已成功,rejected已失败,只有异步操作的结果,才可以决定当前是哪一种状态,任何其他操作都无法改变这个状态,这也就是promise名字的由来。
- 一旦状态改变,就不会再变,promise对象状态改变只有两种可能,从pending改到fulfilled或者从pending改到rejected,只要这两种情况发生,状态就凝固了,不会再改变,这个时候就称为定型resolved.
let promise1 = new Promise(function(resolve,reject){setTimeout(function(){resolve('ok')},1000);
});
promise1.then(function success(res){console.log(res);
}).catch(function error(err){console.log(err);
);
53.ES6箭头函数的特性
- 箭头函数没有this,所以需要通过查找作用域链来确定this的值,这就意味着如果箭头函数被非箭头函数包含,this绑定的就是最近一层非箭头函数的this。
- 箭头函数没有自己的arguments对象,但是可以访问外围函数的arguments对象。
- 不能通过new关键字调用,同样也没有new.target值和原型。
- call和apply方法只有参数,没有作用域。
- 不可以使用yield命令,因此箭头函数不能用作 Generator 函数。
54.同步任务、异步任务、宏任务、微任务基本概念
同步任务: 指的是在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务。
异步任务: 指的是不进入主线程,某个异步任务可以执行了,该任务才会进入主线程执行。
异步执行的运行机制如下(同步任务也如此,因为它可以被视为没有异步任务的异步执行):
- 所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)
- 主线程之外,还存在一个“任务队列”,只要异步任务有了运行结果,就在“任务队列”之中放置一个事件
- 一旦“执行栈”中的所有同步任务执行完毕,系统就会读取“任务队列”,看看里面有哪些事件。那些对应的异步任务,于是结束等待,进入执行栈,开始执行
- 主线程不断重复第3步
javascript提供的与“任务队列”有关的方法有:setTimeout、setInterval、process.nextTick和setImmediate。
process.nextTick方法可以在当前“执行栈”的尾部——下一次Event Loop(主线程读取“任务队列”)之前——触发回调函数。也就是说,它指定的任务总是发生在所有异步任务之前。
setImmediate方法则是在当前“任务队列”的尾部添加事件,也即是说,它指定的任务总是在下一次Event Loop时执行。
宏任务macrotask: 可以理解是每次执行栈执行的代码就是一个宏任务(包括每次从事件队列中获取一个事件回调并放到执行栈中执行)。主要场景有:主代码块、setTimeout、setInterval等。
微任务microtask: 可以理解是在当前task执行结束后立即执行的任务。主要场景有:Promise、process.nextTick等。
55.简单讲一讲ES6的一些新特性
ES6在变量的声明和定义方面增加了let、const声明变量,有局部变量的概念,赋值中有比较吸引人的结构赋值,同时ES6对字符串、 数组、正则、对象、函数等拓展了一些方法,如字符串方面的模板字符串、函数方面的默认参数、对象方面属性的简洁表达方式,ES6也 引入了新的数据类型symbol,新的数据结构set和map,symbol可以通过typeof检测出来,为解决异步回调问题,引入了promise和 generator,还有最为吸引人了实现Class和模块,通过Class可以更好的面向对象编程,使用模块加载方便模块化编程,当然考虑到 浏览器兼容性,我们在实际开发中需要使用babel进行编译。
重要的特性:
- 块级作用域:ES5只有全局作用域和函数作用域,块级作用域的好处是不再需要立即执行的函数表达式,循环体中的闭包不再有问题
- rest参数:用于获取函数的多余参数,这样就不需要使用arguments对象了
- promise:一种异步编程的解决方案,比传统的解决方案回调函数和事件更合理强大
- 模块化:其模块功能主要有两个命令构成,export和import,export命令用于规定模块的对外接口,import命令用于输入其他模块提供的功能
56.解释jsonp的原理,以及为什么不是真正的ajax
jsonp的原理:就是利用浏览器可以动态地插入一段js并执行的特点完成的。
为什么不是真正的ajax:
- 实质不同
ajax的核心是:通过XmlHttpRequest获取非本页内容
jsonp的核心:动态添加标签来调用服务器提供的js脚本- ajax通过服务端代理一样跨域,jsonp也不并不排斥同域的数据的获取
- jsonp是一种方式或者说非强制性的协议,ajax也不一定非要用json格式来传递数据
- jsonp只支持get请求,ajax支持get和post请求
57.解释什么是Json
- JSON是一种轻量级的数据交换格式。
- JSON独立于语言和平台,JSON解析器和JSON库支持许多不同的编程语言。
- JSON的语法表示三种类型值,简单值(字符串,数值,布尔值,null),数组,对象。
58.dom是什么
文档对象模型(Document Object Model,简称DOM),DOM是针对HTML和XML文档的一个API(应用程序编程接口),DOM描绘了一个层次化的节点树,允许开发人员添加,移除,修改页面的某一部分。DOM是W3C组织推荐的处理可扩展标志语言的标准编程接口。在网页上,组织页面(或文档)的对象被组织在一个树形结构中,用来表示文档中对象的标准模型就称为DOM。
59.redux用处
在组件化的应用中,会有着大量的组件层级关系,深嵌套的组件与浅层父组件进行数据交互,变得十分繁琐困难。而redux,站在一个服务级别的角度,可以毫无阻碍地将应用的状态传递到每一个层级的组件中。redux就相当于整个应用的管家。
60.redux里常用方法
- 提供 getState() 方法获取 state;
- 提供 dispatch(action) 方法更新 state;
- 通过 subscribe(listener) 注册监听器;
61.说说vue react angularjs jquery的区别
- JQuery与另外几者最大的区别是,JQuery是事件驱动,其他两者是数据驱动。
- JQuery业务逻辑和UI更改该混在一起, UI里面还参杂这交互逻辑,让本来混乱的逻辑更加混乱。
- Angular,vue是双向绑定,而React不是
62.介绍一下react
- React 是一个用于构建用户界面的 JAVASCRIPT 库。React主要用于构建UI,很多人认为 React 是 MVC 中的 V(视图)
React特点有:- 声明式设计 −React采用声明范式,可以轻松描述应用。
- 高效 −React通过对DOM的模拟,最大限度地减少与DOM的交互。
- 灵活 −React可以与已知的库或框架很好地配合。
- JSX − JSX 是 JavaScript 语法的扩展。React 开发不一定使用 JSX ,但我们建议使用它。
- 组件 − 通过 React 构建组件,使得代码更加容易得到复用,能够很好的应用在大项目的开发中。
- 单向响应的数据流 − React 实现了单向响应的数据流,从而减少了重复代码,这也是它为什么比传统数据绑定更简单。
63. React单项数据流
在React中,数据是单向流动的,是从上向下的方向,即从父组件到子组件的方向。state和props是其中重要的概念,如果顶层组件初始化props,那么React会向下遍历整颗组件树,重新渲染相关的子组件。其中state表示的是每个组件中内部的的状态,这些状态只在组件内部改变。把组件看成是一个函数,那么他接受props作为参数,内部由state作为函数的内部参数,返回一个虚拟dom的实现。
64.reactJs的组件交流
React组件之间的交流方式可以分为以下三种
- 父组件向子组件传值:主要是利用props来进行交流
- 子组件向父组件传值:子组件通过控制自己的state然后告诉父组件的点击状态。然后在父组件中展示出来,如图:
- 没有任何嵌套关系的组件之间传值:如果组件之间没有任何关系,组件嵌套层次比较深(个人认为 2 层以上已经算深了),或者你为了一些组件能够订阅、写入一些信号,不想让组件之间插入一个组件,让两个组件处于独立的关系。对于事件系统,这里有 2 个基本操作步骤:订阅(subscribe)/监听(listen)一个事件通知,并发送(send)/触发(trigger)/发布(publish)/发送(dispatch)一个事件通知那些想要的组件。
65.react的生命周期函数
初始化
- getDefaultProps(),设置默认的props,也可以用dufaultProps设置组件的默认属性。
- getInitialState(),在使用es6的class语法时是没有这个钩子函数的,可以直接在constructor中定义this.state。此时可以访问this.props。
- componentWillMount(),组件初始化时只调用,以后组件更新不调用,整个生命周期只调用一次,此时可以修改state。
- render(),react最重要的步骤,创建虚拟dom,进行diff算法,更新dom树都在此进行。此时就不能更改state了。
- componentDidMount(),组件渲染之后调用,只调用一次。
更新
- componentWillReceiveProps(nextProps),组件初始化时不调用,组件接受新的props时调用。
- shouldComponentUpdate(nextProps, nextState),react性能优化非常重要的一环。组件接受新的state或者props时调用,我们可以设置在此对比前后两个props和state是否相同,如果相同则返回false阻止更新,因为相同的属性状态一定会生成相同的dom树,这样就不需要创造新的dom树和旧的dom树进行diff算法对比,节省大量性能,尤其是在dom结构复杂的时候。
componentWillUpdata(nextProps, nextState),组件初始化时不调用,只有在组件将要更新时才调用,此时可以修改state。- render()
组件渲染
- componentDidUpdate(),组件初始化时不调用,组件更新完成后调用,此时可以获取dom节点。
卸载
- componentWillUnmount(),组件将要卸载时调用,一些事件监听和定时器需要在此时清除。
66. setState之后的流程
在代码中调用setState函数之后,React 会将传入的参数对象与组件当前的状态合并,然后触发所谓的调和过程(Reconciliation)。 经过调和过程,React 会以相对高效的方式根据新的状态构建 React 元素树并且着手重新渲染整个UI界面。 在 React 得到元素树之后,React 会自动计算出新的树与老树的节点差异,然后根据差异对界面进行最小化重渲染。 在差异计算算法中,React 能够相对精确地知道哪些位置发生了改变以及应该如何改变,这就保证了按需更新,而不是全部重新渲染。
67.OSI七层模型
- 应用层:文件传输,常用协议HTTP、snmp、FTP
- 表示层:数据格式化,代码转换,数据加密
- 会话层:建立,解除会话
- 传输层:提供端对端的接口,TCP、UDP
- 网络层:为数据包选择路由,IP、icmp
- 数据链路层:传输有地址的帧
- 物理层:二进制的数据形式在物理媒体上传输数据
68.TCP/IP的网络模型
- TCP/IP模型是一系列网络协议的总称,这些协议的目的是使得计算机之间可以进行信息交换
- TCP/IP模型四层架构从下到上分别是链路层,网络层,传输层,应用层
- 链路层的作用是负责建立电路连接,是整个网络的物理基础,典型的协议包括以太网,ADSL等
- 网络层负责分配地址和传送二进制数据,主要协议是IP协议
- 传输层负责传送文本数据,主要协议是TCP
- 应用层负责传送各种最终形态的数据,是直接与用户信息打交道的层,主要协议是http,ftp等
69.怎么生成token,怎么传递
接口特点汇总:
- 因为是非开放性的,所以所有的接口都是封闭的,只对公司内部的产品有效;
- 因为是非开放性的,所以OAuth那套协议是行不通的,因为没有中间用户的授权过程;
- 有点接口需要用户登录才能访问;
- 有点接口不需要用户登录就可访问;
针对以上特点,移动端与服务端的通信就需要2把钥匙,即2个token。
- 第一个token是针对接口的(api_token)
- 第二个token是针对用户的(user_token)
70.操作系统进程和线程的区别
- 进程,是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。
- 线程,是进程的一部分,一个没有线程的进程可以被看作是单线程的。线程有时又被称为轻权进程或轻量级进程,也是 CPU 调度的一个基本单位。
71.线程的那些资源共享,那些资源不共享
共享的资源
- 堆 :由于堆是在进程空间中开辟出来的,所以它是理所当然地被共享的;因此new出来的都是共享的(16位平台上分全局堆和局部堆,局部堆是独享的)
- 全局变量:它是与具体某一函数无关的,所以也与特定线程无关;因此也是共享的
- 静态变量:虽然对于局部变量来说,它在代码中是“放”在某一函数中的,但是其存放位置和全局变量一样,存于堆中开辟的.bss和.data段,是共享的
- 文件等公用资源:这个是共享的,使用这些公共资源的线程必须同步。Win32 提供了几种同步资源的方式,包括信号、临界区、事件和互斥体。
独享的资源
- 栈:栈是独享的
- 寄存器:这个可能会误解,因为电脑的寄存器是物理的,每个线程去取值难道不一样吗?其实线程里存放的是副本,包括程序计数器PC
72.进程间的通信方式有哪些
- 无名管道:半双工的通信方式,数据只能单向流动且只能在具有亲缘关系的进程间使用
- 高级管道:将另一个程序当作一个新的进程在当前程序进程中启动,则这个进程算是当前程序的子进程
- 有名管道,:也是半双工的通信方式,但是允许没有亲缘进程之间的通信
- 消息队列:消息队列是有消息的链表,存放在内核中,并由消息队列标识符标识,消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限的缺点
- 信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问,它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源
- 信号:用于通知接受进程某个事件已经发生
- 共享内存:共享内存就是映射一段能被其他进程所访问的内存。这段共享内存由一个进程创建,但是多个进程可以访问,共享内存是最快的IPC 方式,往往与其他通信机制配合使用
- 套接字:可用于不同机器之间的进程通信
73.rest运算符
rest参数和一个变量名搭配使用,生成一个数组,用于获取函数多余的参数
function input(...params){console.log(params)
}
input(1,2,3,4) //[1,2,3,4]function input2(a,b,...params){console.log(params)
}
input2(1,2,3,4) //[3,4]
rest参数作用: 将多余的逗号分隔的参数序列转换为数组参数(rest参数必须是最后一个参数,否则报错)
74.js中defer和async的区别
<script src="script.js"></script>
没有 defer 或 async,浏览器会立即加载并执行指定的脚本,“立即”指的是在渲染该 script 标签之下的文档元素之前,也就是说不等待后续载入的文档元素,读到就加载并执行。
<script async src="script.js"></script>
有 async,加载和渲染后续文档元素的过程将和 script.js 的加载与执行并行进行(异步)。
<script defer src="script.js"></script>
有 defer,加载后续文档元素的过程将和 script.js 的加载并行进行(异步),但是 script.js 的执行要在所有元素解析完成之后,DOMContentLoaded 事件触发之前完成。
defer (延迟脚本)
- 延迟脚本:defer属性只适用于外部脚本文件。如果给script标签定义了defer属性,这个属性的作用是表明脚本在执行时不会影响页面的构造。也就是说,脚本会被延迟到整个页面都解析完毕后再运行。因此,如果script元素中设置了defer属性,相当于告诉浏览器立即下载,但延迟执行。
- defer并行加载js文件,会按照页面上script标签的顺序执行
async(异步脚本)
- 异步脚本:async属性也只适用于外部脚本文件,并告诉浏览器立即下载文件。
- async并行加载js文件,下载完成立即执行,不会按照页面上script标签的顺序执行。
75.哪些操作会造成内存泄漏
内存泄漏指任何对象在您不再拥有或需要它之后仍然存在。
- 垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为 0(没有其他对象引用过该对象),或对该对象的惟一引用是循环的,那么该对象的内存即可回收。
- setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏。
闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)
76.列举IE 与其他浏览器不一样的特性
- IE支持currentStyle,FIrefox使用getComputStyle
- IE 使用innerText,Firefox使用textContent
- 滤镜方面:IE:filter:alpha(opacity= num);Firefox:-moz-opacity:num
- 事件方面:IE:attachEvent:火狐是addEventListener
- 鼠标位置:IE是event.clientX;火狐是event.pageX
- IE使用event.srcElement;Firefox使用event.target
- IE中消除list的原点仅需margin:0即可达到最终效果;FIrefox需要设置margin:0;padding:0以及list-style:none
- CSS圆角:ie7以下不支持圆角
77.Flash、Ajax各自的优缺点,在使用中如何取舍
- Flash适合处理多媒体、矢量图形、访问机器;对CSS、处理文本上不足,不容易被搜索。
- Ajax对CSS、文本支持很好,支持搜索;多媒体、矢量图形、机器访问不足。
- 共同点:与服务器的无刷新传递消息、用户离线和在线状态、操作DOM
78.SQL增删改查
创建表:create table student(id,name,age)
删除表:drop table student
插入数据:insert into student values(1001,'zhangsan',12,'123')
修改数据:update student set name='lisi' where id=1001
查询数据:select * from student
删除数据:delete from student
79.indexedDB
该数据库是一种存储在客户端本地的NoSQL数据库,目前Firefox4+,IE10,Chrome11+对其提供了支持数据库–>数据仓库/对象仓库/对象存储–>对象记录。
- 一个网站可能有一个或多个 IndexedDB 数据库,每个数据库必须具有唯一的名称。
- 一个对象存储(由一个名称惟一标识)是一个记录集合。
- 每个记录有一个键和一个值。该值是一个对象,可拥有一个或多个属性。键可能基于某个键生成器,从一个键路径衍生出来,或者是显式设置。一个键生成器自动生成唯一的连续正整数。键路径定义了键值的路径。它可以是单个 JavaScript 标识符或多个由句点分隔的标识符。
- 在indexedDB-API中,对象仓库中的每一条记录均为一个具有一个或多个属性值的对象。
80.MVC和MVVM
MVC:后台主导开发的思想。这种思想一般应用在后端中的web层,m表示model数据模型,v表示view视图,c表示controller控制器。在 servlet、jsp 中主要应用的就是mvc思想。

MVC有两个很明显的问题:
- m层和v层直接打交道,导致这两层耦合度高
- 因为所有逻辑都写在c层,导致c层特别臃肿
MVP:p层代替了了c层,v层和m层的交互被p层隔断,从理论上去除了v和m层的耦合,但是造成p层比原来的c层更加臃肿,为了缓解这种臃肿,MVVM出现了。

MVVM:前后台分离开发中的前端思想。m表示model数据模型,v表示view视图,vm表示视图模型,负责把Model的数据同步到View显示出来,还负责把View的修改同步回Model。React、Vue、AngularJS中主要应用的就是mvvm思想。

简单的来说MVVM其实就是MVP中把P层削弱为VM层,部分简单的逻辑职责分给了View层。
81.JSX
React 使用 JSX 来替代常规的 JavaScript。JSX 是一个看起来很像 XML 的 JavaScript 语法扩展。
JSX的优点:
- JSX 执行更快,因为它在编译为 JavaScript 代码后进行了优化。
- 它是类型安全的,在编译过程中就能发现错误。
- 使用 JSX 编写模板更加简单快速。
const element = <h1>Hello, world!</h1>;
注意:由于 JSX 就是 JavaScript,一些标识符像 class 和 for 不建议作为 XML 属性名。作为替代,React DOM 使用 className 和 htmlFor 来做对应的属性。
ReactDOM.render(<h1>Hello, world!</h1>,document.getElementById('example')
);
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!




