C#、Java同样JavaScript有自动垃圾回收机制,JavaScript垃圾回收的机制很简单:找出再也不使用的变量,而后释放掉其占用的内存,可是这个过程不是时时的,由于其开销比较大,因此垃圾回收器会按照固定的时间间隔周期性的执行。javascript
标记清除css
这是JavaScript最多见的垃圾回收方式,当变量进入执行环境的时候,好比函数中声明一个变量,垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”。至于怎么标记有不少种方式,好比特殊位的反转、维护一个列表等,这些并不重要,重要的是使用什么策略,原则上讲不可以释放进入环境的变量所占的内存,它们随时可能会被调用的到。html
垃圾回收器会在运行的时候给存储在内存中的全部变量加上标记,而后去掉环境中的变量以及被环境中变量所引用的变量(闭包),在这些完成以后仍存在标记的就是要删除的变量了,由于环境中的变量已经没法访问到这些变量了,而后垃圾回收器相会这些带有标记的变量机器所占空间。前端
引用计数法vue
引用计数的含义是跟踪记录每一个值被引用的次数。当声明了一个变量并将一个引用类型值赋给该变量时,则这个值的引用次数就是1。若是同一个值又被赋给另外一个变量,则该值的引用次数加1。相反,若是包含对这个值引用的变量又取得了另一个值,则这个值的引用次数减1。当这个值的引用次数变成0时,则说明没有办法再访问这个值了,于是就能够将其占用的内存空间回收回来。这样,当垃圾回收器下次再运行时,它就会释放那些引用次数为0的值所占用的内存。java
浏览器的同源策略是浏览器上为安全性考虑实施的很是重要的安全策略。
从一个域上加载的脚本不容许访问另一个域的文档属性。
举个例子:好比一个恶意网站的页面经过iframe嵌入了银行的登陆页面(两者不一样源),
若是没有同源限制,恶意网页上的javascript脚本就能够在用户登陆银行的时候获取用户名和密码。
何谓同源:URL由协议、域名、端口和路径组成,若是两个URL的协议、域名和端口相同,则表示它们同源。
在浏览器中,<script>、<img>、<iframe>、<link>等标签均可以加载跨域资源,而不受同源限制,
但浏览器会限制脚本中发起的跨域请求。好比,使用 XMLHttpRequest 对象和Fetch发起 HTTP 请求就必须遵照同源策略。
Web 应用程序经过 XMLHttpRequest 对象或Fetch能且只能向同域名的资源发起 HTTP 请求,而不能向任何其它域名发起请求。
不容许跨域访问并不是是浏览器限制了发起跨站请求,而是跨站请求能够正常发起,可是返回结果被浏览器拦截了。
最好的例子是CSRF跨站攻击原理,请求是发送到了后端服务器,不管是否设置容许跨域,
有些浏览器不容许从HTTPS跨域访问HTTP,好比Chrome和Firefox,这些浏览器在请求还未发出的时候就会拦截请求,这是特例。
克服跨域限制的方法有(实践中后两种最经常使用,因此重点介绍):
(1)经过jsonp跨域
(2)经过修改document.domain来跨子域
(3)使用window.name来进行跨域
(4)使用HTML5中新引进的window.postMessage方法来跨域传送数据
(5)使用代理服务器,使用代理方式跨域更加直接,由于同源限制是浏览器实现的。若是请求不是从浏览器发起的,就不存在跨域问题了。
使用本方法跨域步骤以下:
1. 把访问其它域的请求替换为本域的请求
2. 服务器端的动态脚本负责将本域的请求转发成实际的请求
为了经过Ajax从http://localhost:8080访问http://localhost:8081/api,能够将请求发往http://localhost:8080/api。
而后利用Apache Web服务器的Reverse Proxy功能作以下配置:ProxyPass /api http://localhost:8081/api
(6)CORS全称是"跨域资源共享"(Cross-origin resource sharing),CORS须要浏览器和服务器同时支持。目前,全部浏览器都支持该功能
(IE浏览器不能低于IE10),所以,实现CORS通讯的关键是服务器。只要服务器实现了CORS接口,就能够跨源通讯。
浏览器将CORS请求分红两类:简单请求(simple request)和非简单请求(not-so-simple request)
(1) 请求方法是如下三种方法之一:HEAD GET POST
(2)HTTP的头信息不超出如下几种字段:Accept Accept-Language Content-Language Last-Event-ID
Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
凡是不一样时知足上面两个条件,就属于非简单请求。
对于简单请求,浏览器在发出CORS请求时会在头信息之中增长一个Origin字段。服务器的返回会多出3个字段:
Access-Control-Allow-Origin(必须) 容许跨域的源
Access-Control-Allow-Credentials(可选) 表示是否容许发送Cookie。默认状况下,Cookie能够包含在请求中,一块儿发给服务器
若是服务器不须要浏览器发送Cookie,删除该字段便可。
Access-Control-Expose-Headers(可选) CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:
Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。若是想拿到其余字段,
就必须在Access-Control-Expose-Headers里面指定。如指定Access-Control-Expose-Headers: FooBar,则可经过
getResponseHeader('FooBar')获取FooBar字段的值。
非简单请求是那种对服务器有特殊要求的请求,好比请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json。
非简单请求的CORS请求,会在正式通讯以前,增长一次HTTP查询请求,称为"预检"请求(preflight)。
"预检"请求用的请求方法是OPTIONS,表示这个请求是用来询问的。头信息里面,关键字段是Origin,表示请求来自哪一个源。
浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可使用哪些HTTP动词和头信息字段。只有获得确定答复,
浏览器才会发出正式的XMLHttpRequest请求,不然就报错。node
三列布局jquery
1,:Floatgit
全局(overflow:hidden)es6
左边 float:left 右边float:right 中间margin-left:左边的宽度 margin-right:右边的宽度
2:Position
左边 Position:absolute 右边Position:absolute 中间margin-left:左边的宽度 margin-right:右边的宽度 或者margin:0 右宽度 0 左宽度:
3:bfc和float配合使用
<div class="wrap">
<div class="middle">
<div class="main">中间</div> </div>
<div class="left">左侧</div>
<div class="right">右侧</div>
</div>
<style type="text/css">
.wrap {overflow: hidden;}
.left {float: left; width: 200px; height: 100px; background: coral; margin-left: -100%;}
.middle {float: left; width: 100%; height: 100px; background: lightblue;}
.right {float: left; width: 120px; height: 100px; background: gray; margin-left: -120px;}
.main {margin: 0 140px 0 220px; background: lightpink;}
</style>
4:flex布局
仅仅须要将display:flex布局
原型链是什么详解:
http://www.javashuo.com/article/p-fokaolhp-w.html
js实现继承的方法
1原型链继承
2构造继承
3实例继承
4拷贝继承
5组合继承
6寄生组合继承
http://www.cnblogs.com/humin/p/4556820.html
内存泄漏和垃圾回收机制
http tcp udp websocket
主要关于websocket
Websocket是一个持久化的协议,相对于HTTP这种非持久的协议来讲
http://www.cnblogs.com/fuqiang88/p/5956363.html
typeof 运算符返回一个用来表示表达式的数据类型的字符串。
可能的字符串有:"number"、"string"、"boolean"、"object"、"function" 和 "undefined"。
堆栈数据结构区别
堆(数据结构):堆能够被当作是一棵树,如:堆排序。
栈(数据结构):一种先进后出的数据结构。
主要的区别由如下几点:
一、管理方式不一样;
二、空间大小不一样;
三、可否产生碎片不一样;
四、生长方向不一样;
五、分配方式不一样;
六、分配效率不一样;
浅拷贝 用object.assign方法
深拷贝
1种:jso.stringify实现
2种:for in实现遍历和复制
3种:利用数组array.prototype.forEach进行copy
https://blog.csdn.net/qq_39083004/article/details/80206336
css单位 尺寸和颜色
http://www.w3school.com.cn/cssref/css_units.asp
网页渲染流程
http://www.javashuo.com/article/p-dwfigiwh-g.html
html以构建dom树 -> 构建render树 -> 布局render树 -> 绘制render树
(1) HTML/SVG/XHTML,解析这三种文件会产生一个 DOM Tree。
(2) CSS,解析 CSS 会产生 CSS 规则树。
(3) JavaScript脚本,主要是经过 DOM API 和 CSSOM API 来操做 DOM Tree 和 CSS Rule Tree.
Css不会阻塞dom解析 但会阻塞dom渲染
https://blog.csdn.net/bg70pvnybv1/article/details/78819711
js判断数据类型的方法
浏览器缓存问题
http://www.cnblogs.com/skynet/archive/2012/11/28/2792503.html
前端模块化cmd amd es6
主线程和异步操做
主线程先执行 执行完再异步操做 。
产生异步操做 set promise.then gnentrate think和white(不肯定)
加载速度提高
图片懒加载和预加载 精灵技术 cnd scritp放在css后面执行
节流
函数节流,简单地讲,就是让一个函数没法在很短的时间间隔内连续调用,只有当上一次函数执行后过了你规定的时间间隔,才能进行下一次该函数的调用。以impress上面的例子讲,就是让缩放内容的操做在你不断改变窗口大小的时候不会执行,只有你停下来一下子,才会开始执行。
去抖 屡次请求 必须等时间间隔运行 屡次触发从最后一次深远时间场景:鼠标用户不停点提交
Float与position同时使用
https://blog.csdn.net/qq_27346075/article/details/82288242
rem怎么用?作不一样手机的适配怎么作?
rem是css单位;
1rem的大小是经过html下的font-size这个css属性告诉浏览器的;
使用替换px所在的位置便可
箭头函数的特色
https://www.jb51.net/article/50770.htm
vue双向绑定
数据更新视图 视图更新数据
1.实现一个监听器Observer,用来劫持并监听全部属性,若是有变更的,就通知订阅者。
2.实现一个订阅者Watcher,能够收到属性的变化通知并执行相应的函数,从而更新视图。
3.实现一个解析器Compile,能够扫描和解析每一个节点的相关指令,并根据初始化模板数据以及初始化相应的订阅器。
Vue源码
https://github.com/answershuto/learnVue
vue依赖收集
http://www.javashuo.com/article/p-sgshffnh-ea.html
https://segmentfault.com/q/1010000008455668
说说Cookie和Session的区别?
一、Cookie和Session都是会话技术,Cookie是运行在客户端,Session是运行在服务器端。
二、Cookie有大小限制以及浏览器在存cookie的个数也有限制,Session是没有大小限制和服务器的内存大小有关。
三、Cookie有安全隐患,经过拦截或本地文件找获得你的cookie后能够进行攻击。
四、Session是保存在服务器端上会存在一段时间才会消失,若是session过多会增长服务器的压力。
Session后端如何存储服务器
https://blog.csdn.net/yzi_angel/article/details/52947733
线程与进程
程序一旦运行就是进程,或者更专业化来讲:进程是指程序执行时的一个实例。
线程是进程的一个实体。
进程——资源分配的最小单位,线程——程序执行的最小单位。
线程进程的区别体如今几个方面:
第一:由于进程拥有独立的堆栈空间和数据段,因此每当启动一个新的进程必须分配给它独立的地址空间,创建众多的数据表来维护它的代码段、堆栈段和数据段,这对于多进程来讲十分“奢侈”,系统开销比较大,而线程不同,线程拥有独立的堆栈空间,可是共享数据段,它们彼此之间使用相同的地址空间,共享大部分数据,比进程更节俭,开销比较小,切换速度也比进程快,效率高,可是正因为进程之间独立的特色,使得进程安全性比较高,也由于进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不一样执行路径。一个线程死掉就等于整个进程死掉。
第二:体如今通讯机制上面,正由于进程之间互不干扰,相互独立,进程的通讯机制相对很复杂,譬如管道,信号,消息队列,共享内存,套接字等通讯机制,而线程因为共享数据段因此通讯机制很方便。。
3.属于同一个进程的全部线程共享该进程的全部资源,包括文件描述符。而不一样过的进程相互独立。
4.线程又称为轻量级进程,进程有进程控制块,线程有线程控制块;
5.线程一定也只能属于一个进程,而进程能够拥有多个线程并且至少拥有一个线程;
第四:体如今程序结构上,举一个简明易懂的列子:当咱们使用进程的时候,咱们不自主的使用if else嵌套来判断pid,使得程序结构繁琐,可是当咱们使用线程的时候,基本上能够甩掉它,固然程序内部执行功能单元须要使用的时候仍是要使用,因此线程对程序结构的改善有很大帮助。
进程与线程的选择取决如下几点:
一、须要频繁建立销毁的优先使用线程;由于对进程来讲建立和销毁一个进程代价是很大的。
二、线程的切换速度快,因此在须要大量计算,切换频繁时用线程,还有耗时的操做使用线程可提升应用程序的响应
三、由于对CPU系统的效率使用上线程更占优,因此可能要发展到多机分布的用进程,多核分布用线程;
四、并行操做时使用线程,如C/S架构的服务器端并发线程响应用户的请求;
五、须要更稳定安全时,适合选择进程;须要速度时,选择线程更好。
栈存的基本类型 Undefined、Null、Boolean、Number 和 String,这5中基本数据类型能够直接访问,他们是按照值进行分配的,存放在栈(stack)内存中的简单数据段,数据大小肯定,内存空间大小能够分配。
堆是引用类型
http://www.javashuo.com/article/p-grkectxk-mm.html
promise.then相似于Promise.all() ,区别在于 它有任意一个返回成功后,就算完成,可是 进程不会当即中止
1、Pomise.all的使用
常见使用场景 : 多个异步结果合并到一块儿
Promise.all能够将多个Promise实例包装成一个新的Promise实例。用于将多个Promise实例,包装成一个新的Promise实例。
1.它接受一个数组做为参数。
2.数组能够是Promise对象,也能够是其它值,只有Promise会等待状态改变。
3.当全部的子Promise都完成,该Promise完成,返回值是所有值的数组。
4.若是有任何一个失败,该Promise失败,返回值是第一个失败的子Promise的结果。
http://www.javashuo.com/article/p-aspwabur-cu.html
bind call apply 区别
call(对象,对象)apply(对象,数组[])
bind 返回对象 手动调用才执行call apply
call this改变 apply 数组 bind返回一个对象
call和apply都是改变上下文中的this并当即执行这个函数,bind方法可让对应的函数想何时调就何时调用,而且能够将参数在执行的时候添加,这是它们的区别,根据本身的实际状况来选择使用。
闭包:
Setimeout(函数,时间)
输出i最后的数 若是想输出1234 用闭包 把函数扩起来再跟一个函数 当即执行函数
for循环 用闭包解决 for循环括起来 当即执行 把
(function()),(i))这个函数就会当即执行 而不是等for循环执行完成以后再执行
apply 、 call 、bind 三者都是用来改变函数的this对象的指向的;
apply 、 call 、bind 三者第一个参数都是this要指向的对象,也就是想指定的上下文;
apply 、 call 、bind 三者均可以利用后续参数传参;
bind 是返回对应函数,便于稍后调用;apply 、call 则是当即调用 。
https三次握手
1. 客户端发起HTTPS请求
2. 服务端的配置
采用HTTPS协议的服务器必需要有一套数字证书,能够是本身制做或者CA证书。区别就是本身颁发的证书须要客户端验证经过,才能够继续访问,而使用CA证书则不会弹出提示页面。这套证书其实就是一对公钥和私钥。公钥给别人加密使用,私钥给本身解密使用。
3. 传送证书
这个证书其实就是公钥,只是包含了不少信息,如证书的颁发机构,过时时间等。
4. 客户端解析证书
这部分工做是有客户端的TLS来完成的,首先会验证公钥是否有效,好比颁发机构,过时时间等,若是发现异常,则会弹出一个警告框,提示证书存在问题。若是证书没有问题,那么就生成一个随即值,而后用证书对该随机值进行加密。
5. 传送加密信息
这部分传送的是用证书加密后的随机值,目的就是让服务端获得这个随机值,之后客户端和服务端的通讯就能够经过这个随机值来进行加密解密了。
6. 服务段解密信息
服务端用私钥解密后,获得了客户端传过来的随机值(私钥),而后把内容经过该值进行对称加密。所谓对称加密就是,将信息和私钥经过某种算法混合在一 起,这样除非知道私钥,否则没法获取内容,而正好客户端和服务端都知道这个私钥,因此只要加密算法够彪悍,私钥够复杂,数据就够安全。
7. 传输加密后的信息
这部分信息是服务段用私钥加密后的信息,能够在客户端被还原。
8 客户端解密信息
客户端用以前生成的私钥解密服务段传过来的信息,因而获取了解密后的内容。
PS: 整个握手过程第三方即便监听到了数据,也一筹莫展。
http://www.cnblogs.com/shangxiaofei/p/5207471.html
HTTPS和HTTP的区别
1. https协议须要到ca申请证书或自制证书。
2. http的信息是明文传输,https则是具备安全性的ssl加密。
3. http是直接与TCP进行数据传输,而https是通过一层SSL(OSI表示层),用的端口也不同,前者是80(须要国内备案),后者是443。
4. http的链接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
附录
HTTPS通常使用的加密与HASH算法以下:
非对称加密算法:RSA,DSA/DSS
对称加密算法:AES,RC4,3DES
HASH算法:MD5,SHA1,SHA256
Es5和es6继承的区别
https://blog.csdn.net/heyue_99/article/details/54932553
promise封装实现ajax过程
https://blog.csdn.net/qq_35844177/article/details/75217681
ajax经常使用的三种方式
http://www.javashuo.com/article/p-xevtrhjg-du.html
事件代理和事件委托
https://blog.csdn.net/majian_1987/article/details/8591385
前端加密
Js加密后传输
浏览器插件内进行加密传输
https传输
提高变量
函数提高在变量提高之上
Sessionid
http://www.javashuo.com/article/p-nesyzutf-ne.html
css隐藏元素
一、opacity:0
二、visibility:hidden
三、diaplay:none
四、position:absolute
https://blog.csdn.net/heye13/article/details/51720600
浏览器输入网站全过程
https://blog.csdn.net/qq_25622107/article/details/55046413
1)在浏览器中输入网址
2)DNS解析:先在浏览器的缓存中,搜索是否有DNS相应缓存,是否过时
if not
在操做系统的缓存中,搜索是否有DNS相应缓存,是否过时
if not
读取C盘中的host文件,看是否有DNS相应缓存,是否过时
if not
发送域名解析请求
3)TCP三次握手,链接服务器
4)浏览器给服务器发送一个HTTP请求
5)HTTP服务器回应一个永久重定向响应
6)浏览器去访问重定向的服务器
7)服务器处理请求(进行数据库查询,用户判断等)
8)服务器发回响应
9)浏览器开始相应html页面
10)浏览器发送获取嵌入到html中的元素
什么是DOM?
DOM是文档对象模型,是一种用于HTML和XML文档的编程接口。它给文档提供了一种结构化的表示方法,能够改变文档的内容和呈现方式。咱们最为关心的是,DOM把网页和脚本以及其余的编程语言联系了起来。文档对象模型把整张网页组织成这样的一个树状的结构,树结构中的每个元素都被视为一个节点(node)。包括JavaScript在内的各类编程语言均可以经过文档对象模型来访问和改变网页的各类细节。
怎么操做Dom?
一些经常使用的 HTML DOM 方法:
getElementById(id) - 获取带有指定 id 的节点(元素)
appendChild(node) - 插入新的子节点(元素)
removeChild(node) - 删除子节点(元素)
一些经常使用的 HTML DOM 属性:
innerHTML - 节点(元素)的文本值
parentNode - 节点(元素)的父节点
childNodes - 节点(元素)的子节点
attributes - 节点(元素)的属性节点
html标签分类?(块级元素和内联元素)
http://www.javashuo.com/article/p-qwnrvwyk-ck.html
js指针问题
异步请求的几种方式
http://www.javashuo.com/article/p-vdulvzkn-ek.html
1种 用原生js方法
2种基于jquery
(1)$.getJSON(url,[data],[callback])
(2)$.ajx()
(3)$.post(url,[data],[callback])或$.get(url,[callback])
Ajax异步请求的整个过程
https://blog.csdn.net/rogerzhanglijie/article/details/8655315
https://blog.csdn.net/huangzhi455633364/article/details/51287432
第一步获得XMLHttpRequest
第二步打开服务器的链接(请求方式get post 请求url 请求是否为异步)
第三步发送请求 *xmlHttp.send(null)若是不给可能会形成部分浏览器没法发送
第四步 Xmlhttprequest对象的一个事件注册监听器onreadystatechange
(0刚建立 1请求开始 2调用完send()方法3服务器已经开始响应4响应结束)
JS引擎的事件循环机制event loop
https://blog.csdn.net/bangbDIV/article/details/82698768
状态码:
http://blog.liujason.com/1406.html
401 未受权 403禁止 404未找到
304 客户端已经执行了GET请求 可是文件未发生变化
http://www.javashuo.com/article/p-djeookxi-ee.html
webstorage和cookie有什么区别
https://www.cnblogs.com/boyuguoblog/p/6203331.html
js继承的方式
原型 构造 实例 拷贝 组合 寄生组合
http://www.javashuo.com/article/p-rwkatbxg-gb.html
组件封装
js前端组件的封装方法
定义一个类
类中增长一个方法
body中定义一个dom节点
脚本中把dom节点和类定义结合起来 , 实现特定的组件功能
vue组件封装
创建组件的模板,先把架子搭起来,写写样式,考虑你的组件的基本逻辑
而后在引用得组件中 用import引入组件
经过component定义组件名称
在把组件以标签的形式写出来。