11:函数A和函数B,实现B继承A,说明优缺点?
// 方式1
function B(){}
function A(){}
B.prototype = new A();
// 方式2
function A(){}
function B(){
A.call(this);
}
方式3
function B(){}
function A(){}
B.prototype = new A();
function B(){
A.call(this)
}
方式1:简单易懂,但是无法实现多继承,父类新增原型方法/原型属性,子类都能访问到
方式2:可以实现多继承,但是只能继承父类的实例属性和方法,不能继承原型属性/方法
方式3:可以继承实例属性/方法,也可以继承原型属性/方法,但是示例了两个A的构造函数
12:CSS和JS位置为什么会影响页面效果?
css在加载过程中不会影响到DOM树的生成,但是会影响到Render树的生成,进而影响到layout,所以一般来说,style的link标签需要尽量放在head里面,因为在解析DOM树的时候是自上而下的,而css样式又是通过异步加载的,这样的话,解析DOM树下的body节点和加载css样式能尽可能的并行,加快Render树的生成的速度。
js脚本应该放在底部,原因在于js线程与GUI渲染线程是互斥的关系,如果js放在首部,当下载执行js的时候,会影响渲染行程绘制页面,js的作用主要是处理交互,而交互必须得先让页面呈现才能进行,所以为了保证用户体验,尽量让页面先绘制出来
13:flex布局
//自行百度,主要几个API
14:描述一下this
this,函数执行的上下文,可以通过apply,call,bind改变this的指向。对于匿名函数或者直接调用的函数来说,this指向全局上下文(浏览器为window,nodejs为global),剩下的函数调用,那就是谁调用它,this就指向谁。当然还有es6的箭头函数,箭头函数的指向取决于该箭头函数声明的位置,在哪里声明,this就指向哪里。
15:游览器的缓存机制
浏览器缓存机制有两种,一种为强缓存,一种为协商缓存。
对于强缓存,浏览器在第一次请求的时候,会直接下载资源,然后缓存在本地,第二次请求的时候,直接使用缓存。
对于协商缓存,第一次请求缓存且保存缓存标识与时间,重复请求向服务器发送缓存标识和最后缓存时间,服务端进行校验,如果失效则使用缓存。
协商缓存方案:
Exprires:服务端的响应头,第一次请求的时候,告诉客户端,该资源什么时候会过期。Exprires的缺陷是必须保证服务端时间和客户端时间严格同步。
Cache-control:max-age,表示该资源多少时间后过期,解决了客户端和服务端时间必须同步的问题,
If-None-Match/ETag:缓存标识,对比缓存时使用它来标识一个缓存,第一次请求的时候,服务端会返回该标识给客户端,客户端在第二次请求的时候会带上该标识与服务端进行对比并返回If-None-Match标识是否表示匹配。
Last-modified/If-Modified-Since:第一次请求的时候服务端返回Last-modified表明请求的资源上次的修改时间,第二次请求的时候客户端带上请求头If-Modified-Since,表示资源上次的修改时间,服务端拿到这两个字段进行对比。
16:ETag这个字符串是怎么生成的?
Etag由服务器端生成,客户端通过If-Match或者说If-None-Match这个条件判断请求来验证资源是否修改。常见的是使用If-None-Match。根据Etag,判断文件内容自上一次请求之后,有没有发生变化。情形一:若两种判断的结论都是文件没有被修改过,则服务器就不给浏览器发index.html的内容了,直接告诉它,文件没有被修改过,你用你那边的缓存吧—— 304 Not Modified,此时浏览器就会从本地缓存中获取index.html的内容。此时的情况叫协议缓存,浏览器和服务器之间有一次请求交互。情形二:若修改时间和文件内容判断有任意一个没有通过,则服务器会受理此次请求,之后的操作同情景一。
17:二叉树的几种遍历方式
自行百度:前序遍历,中序遍历,后序遍历
18:说明你所掌握的所有的排序?实现原理
//选择,冒泡,快速,插入排序,一般这四种
19:请手写实现一个promise
http://www.cnblogs.com/huansky/p/6064402.html
20:svg和canvas各自的优缺点?
svg优点:矢量图,不依赖于像素,无限放大后不会失真。
以dom的形式表示,事件绑定由浏览器直接分发到节点上。
svg缺点:dom形式,涉及到动画时候需要更新dom,性能较低。
canvas优点:定制型更强,可以绘制绘制自己想要的东西。非dom结构形式,用JavaScript进行绘制,涉及到动画性能较高。
canvas缺点:事件分发由canvas处理,绘制的内容的事件需要自己做处理。依赖于像素,无法高效保真,画布较大时候性能较低。