目录:javascript
如何保持登录状态?css
Ajax原生html
若是页面初始载入的时候把ajax请求返回的数据存在localStorage里面,而后每次调用的时候去localStorage里面取数,是否可行。vue
304是什么意思?html5
强缓存和协商缓存的命中和管理java
http请求和响应的消息结构node
http请求头有哪些字段react
答: Cookie是能够覆盖的,若是重复写入同名的Cookie,那么将会覆盖以前的Cookie
若是要删除某个Cookie,只须要新建一个同名的Cookie,并将maxAge设置为0,并添加到response中覆盖原来的Cookie。注意是0而不是负数。负数表明其余的意义。
localStorage存储在一个对象中. 有键值对
答: 把登陆信息如帐号、密码等保存在Cookie中,并控制Cookie的有效期,下次访问时再验证Cookie中的登陆信息便可。
保存登陆信息有多种方案。最直接的是把用户名与密码都保持到Cookie中,下次访问时检查Cookie中的用户名与密码,与数据库比较。这是一种比较危险的选择,通常不把密码等重要信息保存到Cookie中。
还有一种方案是把密码加密后保存到Cookie中,下次访问时解密并与数据库比较。这种方案略微安全一些。若是不但愿保存密码,还能够把登陆的时间戳保存到Cookie与数据库中,到时只验证用户名与登陆时间戳就能够了。
这几种方案验证帐号时都要查询数据库。
//**********第一步, 得到一个xhr对象************* var xmlHttpReq = null; //声明一个空对象用来装入XMLHttpRequest if (window.ActiveXObject){//IE5 IE6是以ActiveXObject的方式引入XMLHttpRequest的 xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP"); } else if (window.XMLHttpRequest){//除IE5 IE6 之外的浏览器XMLHttpRequest是window的子对象 xmlHttpReq = new XMLHttpRequest();//实例化一个XMLHttpRequest } if(xhr != null){ //若是对象实例化成功 //设置回调函数 xhr.onreadystatechange = function(){ if(xhr.readyState == 4){ //肯定响应已经成功返回 //200可做为成功标志, 304表示请求资源没有修改, 可直接使用浏览器缓存 if ((xhr.status>=200 && xhr.status < 300 ) || xhr.status == 304){ alert(xhr.responseText); } else { alert( " Request was unsuccessful: " + xhr.status); } } } //************第二步: 启动请求.****************** //open方法接收三个参数: 要发送的请求类型(get,post等), 请求的url和是否异步发送请求的布尔值 xhr.open("get","test.php",true); //调用open()方法并采用异步方式. 若是第三个参数是false, 同步执行, 则js代码会等到服务器响应以后再继续执行 //*************第三步: 发送数据******************* //send方法接收一个参数,即要做为请求主体发送的数据. 若是不须要经过请求主体发送数据, 则必须传入null. 由于这个参数对有些浏览器是必须的 xhr.send(null); //由于使用get方式提交,因此能够使用null参调用 // 若是要设置请求头部信息,必须在调用open()方法以后且调用send()方法以前调用setRequestHeader()
参考:《JavaScript》高级程序设计第21章:Ajax和Comet,jsonp
答: 动态添加一个<script>标签,而script标签的src属性是没有跨域的限制的。
首先在客户端注册一个callback, 而后把callback的名字传递给服务器. 服务端获得请求的数据后, 要用callback把要输出返回的内容包起来, 这样, 服务器生成的json数据就能被客户端正确接收了.
而后以js语法的方式,生成一个function, function的名字就是传递上来的参数callback方法的名字
最后将json数据直接以入参的方式, 放置到function中, 这样就生成了一段js语法的文档, 返回给客户端.
客户端浏览器, 解析script标签,. 并执行返回的js文档, 此时js文档数据做为参数, 传递到了客户端预先定义好的callback函数里.
参考: JSONP跨域的原理解析
举个栗子:
<script type="text/javascript"> function jsonpCallback(result) { alert(result.msg); } </script> <script type="text/javascript" src="http://crossdomain.com/jsonServerResponse?jsonp=jsonpCallback"></script>
其中jsonCallback是客户端注册的,获取跨域服务器上的JSON数据后,回调的函数。http://crossdomain.com/jsonServerResponse?jsonp=jsonpCallback 这个url是跨域服务器取JSON数据的接口,参数为回调函数的名字,返回的格式为: jsonpCallback({msg:'this is json data'}) 。如此就生成了一段js语法的文档, 传回客户端就能够调用jsonpCallBack函数了.
因此这里也能够看到, 回调函数应当是定义在全局的?
(直接说了不能保证数据的实时性,请求和实时性必然会有一方有所牺牲)
答: 304表示请求资源没有修改, 能够直接使用浏览器缓存.
答:
【Last-Modified,If-Modified-Since】的控制缓存的原理是:
浏览器第一次跟服务器请求一个资源,服务器在返回这个资源的同时,在respone的header加上Last-Modified的header,这个header表示这个资源在服务器上的最后修改时间
浏览器再次跟服务器请求这个资源时,在request的header上加上If-Modified-Since的header,这个header的值就是上一次请求时返回的Last-Modified的值:
服务器再次收到资源请求时,根据浏览器传过来If-Modified-Since和资源在服务器上的最后修改时间判断资源是否有变化,若是没有变化则返回304 Not Modified,可是不会返回资源内容;若是有变化,就正常返回资源内容。当服务器返回304 Not Modified的响应时,response header中不会再添加Last-Modified的header,由于既然资源没有变化,那么Last-Modified也就不会改变,这是服务器返回304时的response header:
浏览器收到304的响应后,就会从缓存中加载资源。
若是协商缓存没有命中,浏览器直接从服务器加载资源时,Last-Modified Header在从新加载的时候会被更新,下次请求时,If-Modified-Since会启用上次返回的Last-Modified值。
【ETag、If-None-Match】: 【Last-Modified,If-Modified-Since】都是根据服务器时间返回的header,通常来讲,在没有调整服务器时间和篡改客户端缓存的状况下,这两个header配合起来管理协商缓存是很是可靠的,可是有时候也会服务器上资源其实有变化,可是最后修改时间却没有变化的状况,而这种问题又很不容易被定位出来,而当这种状况出现的时候,就会影响协商缓存的可靠性。因此就有了另一对header来管理协商缓存,这对header就是【ETag、If-None-Match】。它们的缓存管理的方式是:
浏览器第一次跟服务器请求一个资源,服务器在返回这个资源的同时,在respone的header加上ETag的header,这个header是服务器根据当前请求的资源生成的一个惟一标识,这个惟一标识是一个字符串,只要资源有变化这个串就不一样,跟最后修改时间没有关系,因此能很好的补充Last-Modified的问题:
浏览器再次跟服务器请求这个资源时,在request的header上加上If-None-Match的header,这个header的值就是上一次请求时返回的ETag的值:
服务器再次收到资源请求时,根据浏览器传过来If-None-Match和而后再根据资源生成一个新的ETag,若是这两个值相同就说明资源没有变化,不然就是有变化;若是没有变化则返回304 Not Modified,可是不会返回资源内容;若是有变化,就正常返回资源内容。与Last-Modified不同的是,当服务器返回304 Not Modified的响应时,因为ETag从新生成过,response header中还会把这个ETag返回,即便这个ETag跟以前的没有变化
若是资源已经被浏览器缓存下来,在缓存失效以前,再次请求时,默认会先检查是否命中强缓存,若是强缓存命中则直接读取缓存,若是强缓存没有命中则发请求到服务器检查是否命中协商缓存,若是协商缓存命中,则告诉浏览器仍是能够从缓存读取,不然才从服务器返回最新的资源。这是默认的处理方式
如下行为可能改变缓存的默认处理方式
当ctrl+f5强制刷新网页时,直接从服务器加载,跳过强缓存和协商缓存;
当f5刷新网页时,跳过强缓存,可是会检查协商缓存;
参考: 浏览器缓存知识小结及应用by 流云诸葛
答:
实例见下一题.
url在请求行, cookie在请求头
参考: HTTP请求报文解剖
答:
http请求和http响应都使用头发送有关http消息的信息. 头由一系列行组成, 每行都包含名称, 而后依次是冒号, 空格, 值. 字段可按任何顺序排列. 某些头字段既能够用于请求头也能够用于响应头, 而另外一些字段只能使用其中之一.
许多请求字段都容许客户端在值部分指定多个可接收的选项, 有时甚至能够对这些选项的首选项进行排名. 多个项以逗号分隔. 例如, 客户端能够发送包含"Content-Encoding: gzip, compress"的请求头, 表示能够接受各类压缩类型. 若是服务器的响应正文使用gzip编码,其响应头中将包含"Content-Encoding: gzip".
有些字段能够在单个头中出现屡次, 例如, 头能够有多个"Warning"字段.
下表列出了http1.1头字段. 注意, 有些头字段是mime字段. mime字段在ietf文档rfc2045中进行了定义, 但也可用于http1.1协议.
Cache-Control | 指定请求和响应遵循的缓存机制. 请求消息或响应消息中设置Cache-Control并不会修改另外一个消息处理过程只能怪的缓存处理过程 | "max-age=10" or "no-cache" or "no-store" |
Connection | 处理完此次请求后是否断开链接仍是继续保持链接 | "close" or "Keep-Alive" |
Date | 表示消息发送的时间. 时间的描述格式由rfc822定义 | "Tue, 11 Jul 2000 18:23:51 GMT" |
Pragma | 用来包含实现特殊的指令 知道"no-cache"值表示服务器必须返回一个刷新后的文档, 即便它是代理服务器并且已经有了页面的本地拷贝 |
"no-cache"(与设置Cache-Control: no-cache相同) |
Trailer | "Date" | |
Transfer-Encoding | "chuncked" | |
Upgrade | 向服务器指定某种传输协议以便服务器进行转换(若是支持) | "SHTTP/1.3" |
Via | 通知中间网关或代理服务器地址, 通讯协议 | "HTTP/1.1 Proxy1, HTTP/1.1 Proxy2" |
Warning | 关于实体消息的警告细心 | "112 Disconnected Operation" |
请求消息的第一行格式为:
Method SP Request-URI SP HTTP-Version CRLF
请求头域: 容许客户端向服务器传递关于请求或者关于客户机的附加信息.
Accept | 浏览器可以处理的内容类型. | "text/html, iamge/*" |
Accept-Charset | 告诉服务器, 客户端采用的编码格式/字符集 | "iso8859-5" |
Accept-Encoding | 告诉服务器, 客户机支持的数据压缩格式 | "gzip, compress" |
Accept-Language | 客户机的语言环境 | "en, fr" |
Authorization | 受权信息., 一般出如今对服务器发送的WWW-Authenticate头的应答中 | [credentials] |
Content-Encoding | "gzip" | |
Expect | "100-continue" | |
From | 请求发送者的email地址, 由一些特殊的web客户程序使用, 浏览器不会用到 | "user@microsoft.com" |
Host | 客户机想访问的主机名. 即指定资源的internet主机和端口号. 必须表示请求url的原始服务器或网关的位置, http/1.1 请求必须包含主机头域, 不然系统会以400状态码返回 | "www.microsoft.com" |
If-Match | "entity_tag001" | |
If-Modified-Since | 资源的缓存时间. 只有当所请求的内容在指定的日期以后又通过修改才返回它, 不然返回304 "Not Modified" 应答 | "Tue, 11 Jul 2000 18:12:12 GMT" |
If-None=Match | "entity_tag001" | |
If-Range | "entity_tag001" or "Tue, 11 Jul 2000 18:12:12 GMT" | |
If-Unmodified-Since | "Tue, 11 Jul 2000 18:12:12 GMT" | |
Max-Forwards | "3" | |
Proxy-Authorization | [credentials] | |
Range | 请求实体的一个或者多个子范围. 如示例即表示请求100-599个字节. 可是服务器能够忽略此请求头, 若是无条件get包含range请求头, 响应会以状态码206返回而不是200 |
"bytes=100-599" |
Referer | 告诉服务器, 客户端是从哪一个资源来访问服务器的(防盗链) | "http://www.microsoft.com/resources.asp" |
TE | 客户端愿意接受的传输编码, 并通知服务器接受接受尾加头信息 | "trailers" |
User-Agent | 客户机的软件环境, 浏览器类型 | "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)" |
响应消息的第一行为下面的格式
HTTP-Version SP Status-Code SP Reason-Phrase CRLF
Accecpt-Ranges | 表面服务器是否支持指定范围请求及哪一种类型的分段请求 | "none" |
Age | 从原始服务器到代理缓存造成的估算时间(以秒记, 非负) | "2147483645(2^31)" |
ETag | 缓存相关的头 | "b38b9-17dd-367c5dcd" |
Last-Modified | 请求资源的最后修改时间 | "Tue, 11 Jul 2000 18:23:51 GMT" |
Location | 配合302状态码使用, 用于告诉客户找谁 | "http://localhost/redirecttarget.asp" |
Proxy-Authenticate | 指出认证方案和可应用到代理的该url上的参数 | [challenge] Proxy-Authenticate: Basic |
Retry-After | "Tue, 11 Jul 2000 18:23:51 GMT" or "60" | |
Server | 服务器经过这个告诉浏览器数据的服务器的类型 | "Microsoft-IIS/5.0" |
Vary | "Date" | |
WWW-Authenticate | [challenge] |
请求消息和响应消息均可以包含实体信息. 实体信息通常是由实体头域和实体组成. 实体头域包含关于实体的原信息.实体能够是一个通过编码的字节流. 其编码方式由Content-Encoding和content-Type定义. 长度由Content-Length或Content-Range定义.
实体头字段:实体头字段能够用于请求消息或响应消息. 实体头字段中包含消息实体正文的有关信息, 如使用的编码格式
Allow | "GET, HEAD" | |
Content-Encoding | 数据的压缩格式 | "gzip" |
Content-Language | "en" | |
Content-Length | 请求消息正文的长度 | "8445" |
Content-Location | "http://localhost/page.asp" | |
Content-MD5 | [md5-digest] | |
Content-Range | 用于指定整个实体中的一部分的插入位置, 也指示了整个实体的长度. 在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度 | "bytes 2543-4532/7898" |
Content-Type | 数据的类型. 指定head方法送到接收方的实体介质类型, 或get方法发送的请求介质类型Content-Range实体头 | "text/html" |
Expires | 告诉浏览器把回送的资源缓存多长时间 -1或0则是不缓存. 即应该在何时认为文档已通过期, 从而再也不缓存它 |
"Tue, 11 Jul 2000 18:12:12 GMT" |
Last-Modified | 当前资源的最后缓存时间. 即服务器上保存内容的最后修订时间. 客户能够经过If-Modified-Since请求头提供一个日期, 该请求将被视为一个条件get, 只有改动时间迟于指定时间的文档才会返回, 不然返回一个304(Not Modified)状态 | "Tue, 11 Jul 2000 18:12:12 GMT" |
表明服务器向客户端回送的数据
GET /articles/news/today.asp HTTP/1.1
Accept: */*
Accept-Language: en-us
Connection: Keep-Alive
Host: localhost
Referer: http://localhost/links.asp
User-Agent: Mozilla/4.0 (compatible; MSIE 3.5; Windows NT 5.0)
Accept-Encoding: gzip, deflate
该请求具备请求行, 其中包括方法(GET), 资源路径(/articles/news/today.asp)和http版本(http/1.1). 因为该请求没有正文, 故全部请求行后面的内容都是头的一部分. 紧接着头以后是一个空行, 表示头已结束.
Web服务器能够经过多种方式响应前一个请求, 假设文件是能够访问的, 而且用户具备查看该文件的权限, 则响应相似于:
HTTP/1.1 200 OK Server: Microsoft-IIS/5.0 Date: Thu, 13 Jul 2000 05:34:32 GMT Content-Length: 2291 Content-Type: text/html Set-Cookie: ASPSESSIONIDQQGGGNCG=LKLDFFKCINFLDMFHCBCBMFLJ; path=/ Cache-control: private <HTML> <BODY> ...
响应的第一行称为状态行. 它包含响应所用的http版本, 状态编码(200)和缘由短语. 示例中包含一个头, 其中具备五个字段, 接着是一个空行(回车和换行符), 而后是响应正文的头两行.
参考: HTTP头参考 HTTP协议---HTTP请求中的经常使用请求字段和HTTP的响应状态码及响应头 HTTP头字段
经常使用:
答:
答:
关于以上缓存机制的优先级:
Cache-Control > Expires : 前者设置更详细
Cache-Control/Expires > Last-Modified/ETag : 本地副本根据Cache-Control/Expires还在有效期内, 则不会在此发送请求去服务器询问修改时间或实体标识了
即最前面的最重要, 前面的生效后, 后面的基本就失效了
ETag默认是须要要源网站确认的, 由于要确认是否匹配. 而Last-Modified默认是不向源服务器确认的
在大型多web集群时, 使用ETag有问题. 由于多服务器时INode不同, 因此不一样的服务器生成的ETag不同, 因此用户有可能重复下载(这时ETag就会不许).
若是服务器端同时设置了ETag和Expires时, ETag原理一样, 即与Last-Modified/ETag对应的HttpRequest Header: If-Modified-Since和If-None-Match. 则在彻底匹配If-Modified-Since和If-None-Match即检查完修改时间和ETag后, 服务器才能返回304;
若是服务器又设置了Cache-Control:max-age和Expires时, 也是同时使用.(究竟是同时使用仍是如上所述前者大于后者?)
通常状况下, 使用Cache-Control/ Expires 会配合Last-Modified/ETag一块儿使用, 由于即便在服务器设置缓存时间, 当用户点击"刷新"按钮时, 浏览器会忽略缓存继续向服务器发送请求, 这是后者就能够很好利用304, 从而减小响应开销
ETag是服务器自动生成或者或者由开发者生成的对应资源在服务器端的惟一标识符, 可以更加准确的控制缓存. Last-Modified和ETag是能够一块儿使用的, 服务器会优先验证ETag, 一致的状况下, 才会继续比对Last-Modified, 最后才决定返回304.
用户操做和缓存的关系
用户操做 | Cache-Control/Expires | Last-Modified/ETag |
地址栏回车 | 有效 | 有效 |
页面连接调整 | 有效 | 有效 |
新开窗口 | 有效 | 有效 |
前进后退 | 有效 | 有效 |
F5刷新 | 无效 | 有效 |
Ctrl+F5 | 无效 | 无效 |
参考: 有关客户端浏览器缓存的Http头介绍 HTTP缓存相关的概念 http请求头信息 http响应头信息 expires与etag控制页面缓存的优先级
答:
js语言的执行环境是单线程, 一次只能完成一个任务, 若是有多个任务则须要排队. 因而, js将任务的执行模式分为两种: 同步(Sychronous)和异步(Asynchronous).同步就是后一段等前一个任务执行结束再执行, 异步模式则是: 每个任务有一个回调函数, 前一个任务结束后, 不是执行后一个任务,而是执行回调函数, 后一个任务则是不等前一个任务执行完毕就执行, 因此程序的执行顺序与任务的排序顺序是不一致的, 异步的.
异步的方法:
答:
答: 应该是请求实体吧
答: 创建TCP链接须要三次握手, 而断开链接须要执行四次挥手.
1)用户输入网址
2)浏览器经过DNS获取网站的IP地址。客户端先检查本地是否有对应的IP地址,若找到则返回响应的IP地址。若没找到则请求上级DNS服务器,直至找到或到根节点。
DNS查找IP地址的顺序: 浏览器缓存、系统缓存、互联网服务提供商(ISP)的DNS缓存、递归搜索(从浏览器缓存开始,若是没找到就继续往下一个找。)找到后,浏览器会得到一个IP地址。
3)浏览器客户端发送http请求
HTTP请求包括请求报头和请求主体两个部分,其中请求报头包含了相当重要的信息,包括请求的方法(GET / POST)、目标url、遵循的协议(http / https / ftp…),返回的信息是否须要缓存,以及客户端是否发送cookie等。
4)传输层TCP传输报文。TCP协议经过“三次握手”等方法保证传输的安全可靠。
5)网络层IP协议查询MAC地址
IP协议的做用是把TCP分割好的各类数据包传送给接收方。而要保证确实能传到接收方还须要接收方的MAC地址,也就是物理地址。IP地址和MAC地址是一一对应的关系,一个网络设备的IP地址能够更换,可是MAC地址通常是固定不变的。ARP协议能够将IP地址解析成对应的MAC地址。当通讯的双方不在同一个局域网时,须要屡次中转才能到达最终的目标,在中转的过程当中须要经过下一个中转站的MAC地址来搜索下一个中转目标。
7)数据到达数据链路层
在找到对方的MAC地址后,就将数据发送到数据链路层传输。这时,客户端发送请求的阶段结束
8)服务器接收数据
接收端的服务器在链路层接收到数据包,再层层向上直到应用层。这过程当中包括在运输层经过TCP协议将分段的数据包从新组成原来的HTTP请求报文。
9)服务器响应请求
服务接收到客户端发送的HTTP请求后,查找客户端请求的资源,并返回响应报文,响应报文中包括一个重要的信息——状态码。状态码由三位数字组成,其中比较常见的是200 OK表示请求成功。301表示永久重定向,即请求的资源已经永久转移到新的位置。在返回301状态码的同时,响应报文也会附带重定向的url,客户端接收到后将http请求的url作相应的改变再从新发送。404 not found 表示客户端请求的资源找不到。
10)服务器返回响应文件
请求成功后,服务器会返回相应的HTML文件。接下来就到了页面的渲染阶段了。
11) 页面渲染: 解析HTML以构建DOM树 –> 构建渲染树 –> 布局渲染树 –> 绘制渲染树。
关于页面渲染过程:
1)解析HTML代码,生成一棵DOM树
2)解析CSS文件
3)生成渲染树(受样式影响,包含不可见元素)
4)渲染树中的节点
DOM树是由HTML文件中的标签排列组成,渲染树是在DOM树中加入CSS或HTML中的style样式而造成。渲染树只包含须要显示在页面中的DOM元素,像<head>元素或display属性值为none的元素都不在渲染树中。
在浏览器还没接收到完整的HTML文件时,它就开始渲染页面了,在遇到外部链入的脚本标签或样式标签或图片时,会再次发送HTTP请求重复上述的步骤。在收到CSS文件后会对已经渲染的页面从新渲染,加入它们应有的样式,图片文件加载完马上显示在相应位置。在这一过程当中可能会触发页面的重绘或重排。
答:
关于加载顺序:
<link href="" />
这种形式,内部<style></style>
这种样式定义,在考虑阻塞时也要考虑
主要解析过程:
参考: 浏览器~加载, 解析, 渲染 浏览器加载和渲染html的顺序
cookie数据存放在客户的浏览器上,session数据放在服务器上。
cookie不是很安全,别人能够分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。
session会在必定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。
单个cookie保存的数据不能超过4K,不少浏览器都限制一个站点最多保存20个cookie。
因此建议是:
将登录信息等重要信息存放为SESSION
其余信息若是须要保留,能够放在COOKIE中
同步:脚本会停留并等待服务器发送回复而后再继续。提交请求->等待服务器处理->处理完毕返回,这个期间客户端浏览器不能干任何事。
异步:脚本容许页面继续其进程并处理可能的回复。请求经过事件触发->服务器处理(这是浏览器仍然能够做其余事情)->处理完毕
若要在使用ajax请求后处理发送请求返回的结果,最好使用同步请求。
1
2
3
|
HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: name=value; expires=失效时间; domain=域名
|
Cookie由变量名和值组成, 其属性中既有标准的Cookie变量, 也有用户本身建立的变量,属性中变量是用"变量=值"形式来保存
Cookie格式以下:
Set-Cookie: NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE
Set-Cookie: NAME=VALUE;
Expires=DATE[有效终止日期];
Path=PATH[Path属性定义了Web服务器上哪些路径下的页面可获取服务器设置的Cookie];
Domain=DOMAIN_NAME;
SECURE[在Cookie中标记该变量,代表只有当浏览器和Web Server之间的通讯协议为加密认证协议时,浏览器才向服务器提交相应的Cookie。当前这种协议只有一种,即为HTTPS]
参考: Cookie的组成
答:
sessionStorage 和 localStorage 是HTML5 Web Storage API 提供的,这两种方式都容许开发者使用js设置的键值对进行操做,在在从新加载不一样的页面的时候读出它们。这一点与cookie相似。能够方便的在web请求之间保存数据。有了本地数据,就能够避免数据在浏览器和服务器间没必要要地来回传递。
sessionStorage、localStorage、cookie都是在浏览器端存储的数据, 其中sessionStorage的概念很特别,引入了一个“浏览器窗口”的概念。
sessionStorage是在同源的同学口(或tab)中,始终存在的数据。也就是说只要这个浏览器窗口没有关闭,即便刷新页面或进入同源另外一页面,数据仍然存在。关闭窗口后,sessionStorage即被销毁。同时“独立”打开的不一样窗口,即便是同一页面,sessionStorage对象也是不一样的。
Web Storage 数据彻底存储在客户端, 不须要经过浏览器的请求将数据传给服务器, 所以比cookies可以存储更多的数据,大概5M左右
Web Storage带来的好处:
使用 local storage和session storage主要经过在js中操做这两个对象来实现,分别为window.localStorage和window.sessionStorage. 这两个对象均是Storage类的两个实例,天然也具备Storage类的属性和方法。
减小网络流量:一旦数据保存在本地后,就能够避免再向服务器请求数据,所以减小没必要要的数据请求,减小数据在浏览器和服务器间没必要要地来回传递。
快速显示数据:性能好,从本地读数据比经过网络从服务器得到数据快得多,本地数据能够即时得到。再加上网页自己也能够有缓存,所以整个页面和数据都在本地的话,能够当即显示。
临时存储:不少时候数据只须要在用户浏览一组页面期间使用,关闭窗口后数据就能够丢弃了,这种状况使用sessionStorage很是方便。
答:
js跨域是由于同源策略致使的。解决方法有:
js:
1. 原生js添加class怎么添加,若是自己已经有class了,会不会覆盖,怎么保留?
参考:
原生JS实现addClass,removeClass,toggleClass
2. 事件代理js实现
3. requireJS的原理是什么
4. 数组去除一个函数。用arr.splice。又问splice返回了什么?应该返回的是去除的元素。
5. commonJS和AMD。
6. 对象中key-value的value怎么再放一个对象。(直接放也能够,转成json字符串存数,读取再解析)
CSS
1. CSS实现动画效果
2. Animation还有哪些其余属性?
3. CSS实现三列布局
4. CSS实现保持长宽比1:1
参考:
5. CSS实现两个自适应等宽元素中间空10个像素
6. 浮动的原理以及如何清除浮动
7.
=============================================================
1.css 盒模型
2.css 布局,左边定宽右边自适应。两种方法,NEC上的用负边距消除宽度,用弹性布局。而后问我有没有第三种。。。
3.冒泡和捕获,事件流哪三个阶段?除了冒泡和捕获,还有目标阶段。他们的前后顺序,先捕获,到了目标,再冒泡。(不要只记概念,要了解是干么用的)
4.实现事件代理。用jquery写了。要求写原生。子元素传递上来的应该是event.target或者e.srcElement。这个强调下IE和W3C的区别,建议写一个封装。
5.原型链。继承的两种方法。原型链继承和类继承。而后类继承只继承了实例属性,没有原型属性。原型链继承能够继承全部。而后用apply和call怎么继承原型链上的共享属性?经过空函数传值。新建一个空函数C。C实例化后C的实例属性就是空,而后用B的apply/call去继承C,至关于继承了C的实例属性。
7,闭包。简单说一个闭包的应用。而后闭包的主要做用是什么:封装!
二面:
1.css:两个块状元素上下的margin-top和margin-bottom会重叠。啥缘由?怎么解决?(应该给父类元素添加BFC)
2.js:写一个递归。就是每隔5秒调用一个自身,一共100次。
=============================================================
挖财 面 9.10(2轮技术面,1个多小时,没有HR面,没有offer。)
一面:
你对组件的理解
组件的html怎么进行管理
less和sass用过么
nodejs用过么
js的异步加载,promise的三种状态,ES7中的async用过么
js原型链的继承
静态属性怎么继承
jquery和zepto有什么区别
angular的双向绑定原理
angular和react的认识(挖财用这个两个框架,后来问了)
MVVM是什么
二面:
适配有去考虑么,retina屏幕啊?
rem是什么?em是什么?若是上一层就是根root了,em和rem等价么?
二面面试官给个人感受不好,那我面的也很消极,而后跪了瓜熟蒂落。
1.怎么获得一个页面的a标签(就说了getElementByTagName和选择器)
2.怎么在页面里放置一个很简单的图标,不能用img和background-img
(说了canvas,或者一些库有icon库,data-icon).
3.正则表达式判断url(只写了判断是不是http或者https开头)
4.怎么去除字符串先后的空格(正则匹配^\s和\s$而且替代,Jquery的$.trim,string.trim())
5.实现页面的局部刷新
题目参考: