前端工程师面试问题概括(1、问答类html/css/js基础)

1、参考资源

一、前端面试题及答案整理(一)

二、2017年前端面试题整理汇总100题

三、2018最新Web前端经典面试试题及答案

四、【javascript常见面试题】常见前端面试题及答案

五、Web前端常见面试题及答案

六、常见前端面试题及答案(上)

七、web前端面试题及答案

八、web前端经典面试题

九、javascript之面试题精讲

2、面试题汇总

网上搜到一大堆面试题,重复的很多,所有概括一下,也加上本身的理解javascript

(一)、问答类(html/css/js基础)

一、 JavaScript基础数据类型

JavaScript数据类型包括原始类型和引用类型,原始类型有五个:  Number(数值) String(字符串) Boolean(布尔) Null(空) Undefined(未定义)php

引用类型有一个:Object(对象)css

经过typeof(x)能够返回一个变量x的数据类型“number”、“string”、“boolean”、“undefined”、"object",这里要注意一点:typeof运算符对于null类型返回的是object。html

2 、谈一谈JavaScript做用域链

做用域链的做用是保证执行环境里有权访问的变量和函数是有序的,做用域链的变量只能向上访问,变量访问到window对象即被终止,做用域链向下访问变量是不被容许的。前端

当执行一段JavaScript代码(全局代码或函数)时,JavaScript引擎会为其建立一个做用域又称为执行上下文(Execution Context),在页面加载后会首先建立一个全局的做用域,而后每执行一个函数,会创建一个对应的做用域,从而造成了一条做用域链。每一个做用域都有一条对应的做用域链,链头是全局做用域,链尾是当前函数做用域。html5

做用域链的做用是用于解析标识符,当函数被建立时(不是执行),会将this、arguments、命名参数和该函数中的全部局部变量添加到该当前做用域中,当JavaScript须要查找变量X的时候(这个过程称为变量解析),它首先会从做用域链中的链尾也就是当前做用域进行查找是否有X属性,若是没有找到就顺着做用域链继续查找,直到查找到链头,也就是全局做用域链,仍未找到该变量的话,就认为这段代码的做用域链上不存在x变量,并抛出一个引用错误(ReferenceError)的异常。java

3 、如何理解JavaScript原型链

JavaScript中的每一个对象都有一个prototype属性,咱们称之为原型,而原型的值也是一个对象,所以它也有本身的原型,这样就串联起来了一条原型链,原型链的链头是object,它的prototype比较特殊,值为null。node

原型链的做用是用于对象继承,函数A的原型属性(prototype property)是一个对象,当这个函数被用做构造函数来建立实例时,该函数的原型属性将被做为原型赋值给全部对象实例,好比咱们新建一个数组,数组的方法便从数组的原型上继承而来。jquery

当访问对象的一个属性时, 首先查找对象自己, 找到则返回; 若未找到, 则继续查找其原型对象的属性(若是还找不到实际上还会沿着原型链向上查找, 直至到根). 只要没有被覆盖的话, 对象原型的属性就能在全部的实例中找到,若整个原型链未找到则返回undefined;css3

四、 JavaScript变量声明提早

《JavaScript权威指南》中是这样解释的:JavaScript变量在声明以前已经可用,JavaScript的这个特性被非正式的称为声明提早(hoisting),即JavaScript函数中声明的全部变量(但不涉及赋值)都被“提早”至函数的顶部。

5 、如何理解和应用JavaScript闭包

定义和用法:当一个函数的返回值是另一个函数,而返回的那个函数若是调用了其父函数内部的其它变量,若是返回的这个函数在外部被执行,就产生了闭包。

二、表现形式:使函数外部可以调用函数内部定义的变量。

个人理解是,闭包就是可以读取其余函数内部变量的函数。

因为在Javascript语言中,只有函数内部的子函数才能读取局部变量,所以能够把闭包简单理解成"定义在一个函数内部的函数"。

因此,在本质上,闭包就是将函数内部和函数外部链接起来的一座桥梁。

它的最大用处有两个,一个是能够读取函数内部的变量,另外一个就是让这些变量的值始终保持在内存中。

function f1(){
    var n=999;
    nAdd=function(){n+=1} 
    function f2(){
      alert(n);
    }
    return f2;
  }
  var result=f1();
  result(); // 999
  nAdd();
  result(); // 1000
//nAdd前面没有使用var关键字,所以nAdd是一个全局变量
//nAdd的值是一个匿名函数,而这个匿名函数自己也是一个闭包,因此nAdd至关因而一个setter,能够在函数外部对函数内部的局部变量进行操做。

深刻理解闭包:学习Javascript闭包

使用闭包的注意点

1)滥用闭包,会形成内存泄漏:因为闭包会使得函数中的变量都被保存在内存中,内存消耗很大,因此不能滥用闭包,不然会形成网页的性能问题,在IE中可能致使内存泄露。解决方法是,在退出函数以前,将不使用的局部变量所有删除。

2)会改变父函数内部变量的值。因此,若是你把父函数看成对象(object)使用,把闭包看成它的公用方法(Public Method),把内部变量看成它的私有属性(private value),这时必定要当心,不要随便改变父函数内部变量的值。

6 、new构建对象的本质

经过new操做符,实际上在构造函数User中完成了以下操做:

  • 建立一个新的对象,这个对象的类型是object;
  • 设置这个新的对象的内部、可访问性和prototype属性为构造函数(指prototype.construtor所指向的构造函数)中设置的;
  • 执行构造函数;
  • 返回新建立的对象。
function User(){
        //this = {};  
        //this.constructor = User;
        this.name = "Vicfeel";
        this.age = 23;
        //return this;
    }    
    var user = new User();

若是构造函数默认返回的新建立的this对象,若是手动return 一个变量的话,若是该变量是原始类型则无效,若是是对象,则返回该对象。

1、建立一个空对象,而且 this 变量引用该对象,同时还继承了该函数的原型。
 
2、属性和方法被加入到 this 引用的对象中。
 
3、新建立的对象由 this 所引用,而且最后隐式的返回 thisvar obj  = {};
 
obj.__proto__ = Base.prototype;
 
Base.call(obj);

7 、JavaScript事件代理

事件代理(Event Delegation),又称之为事件委托。是 JavaScript 中经常使用绑定事件的经常使用技巧。顾名思义,“事件代理”便是把本来须要绑定的事件委托给父元素,让父元素担当事件监听的职务。事件代理的原理是DOM元素的事件冒泡。使用事件代理的好处是能够提升性能。

当咱们须要对不少元素添加事件的时候,能够经过将事件添加到它们的父节点而将事件委托给父节点来触发处理函数。

好比咱们须要向一个ul中动态添加不少个li,须要遍历li逐个添加点击事件

众所周知,DOM操做是十分消耗性能的。因此重复的事件绑定简直是性能杀手。而事件代理的核心思想,就是经过尽可能少的绑定,去监听尽可能多的事件。如何作呢?答案是利用事件冒泡机制,对其父节点ul进行事件绑定(Event Bubble),而后经过event.target来判断是哪一个节点触发的事件,从而减小不少EventHandler的绑定。

 var count = 100;
    var ulList = document.getElementById("list");
    //动态构建节点
    for(var i = count;i--;){
        var liDom = document.createElement('li');
        ulList.appendChild(liDom);
    }
    //绑定点击事件
    var liNode = ulList.getElementByTagName("li");
    liNode.onClick = function(e){
        if(e.target && e.target.nodeName.toUpperCase == "LI") {
            // li点击事件
        }
    }

八、position的值, relative和absolute分别是相对于谁进行定位的?

  • absolute :生成绝对定位的元素, 相对于最近一级的 定位不是 static 的父元素来进行定位。

  • fixed (老IE不支持)生成绝对定位的元素,一般相对于浏览器窗口或 frame 进行定位。

  • relative 生成相对定位的元素,相对于其在普通流中的位置进行定位。

  • static 默认值。没有定位,元素出如今正常的流中

  • sticky 生成粘性定位的元素,容器的位置根据正常文档流计算得出

九、如何解决跨域问题

因为浏览器同源策略,凡是发送请求url的协议、域名、端口三者之间任意一与当前页面地址不一样即为跨域。

(1)、porxy代理

定义和用法:proxy代理用于将请求发送给后台服务器,经过服务器来发送请求,而后将请求的结果传递给前端。

实现方法:经过nginx代理;

注意点:一、若是你代理的是https协议的请求,那么你的proxy首先须要信任该证书(尤为是自定义证书)或者忽略证书检查,不然你的请求没法成功。

(2)、CORS 【Cross-Origin Resource Sharing】

定义和用法:是现代浏览器支持跨域资源请求的一种最经常使用的方式。

使用方法:通常须要后端人员在处理请求数据的时候,添加容许跨域的相关操做。以下:

res.writeHead(200, {
    "Content-Type": "text/html; charset=UTF-8",
    "Access-Control-Allow-Origin":'http://localhost',
    'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
    'Access-Control-Allow-Headers': 'X-Requested-With, Content-Type'
});

(3)、jsonp

定义和用法:经过动态插入一个script标签。浏览器对script的资源引用没有同源限制,同时资源加载到页面后会当即执行(没有阻塞的状况下)。

特色:经过状况下,经过动态建立script来读取他域的动态资源,获取的数据通常为json格式。

XmlHttpRequest只容许请求当前源(域名、协议、端口)的资源,为了实现跨域请求,能够经过script标签实现跨域请求,而后在服务端输出JSON数据并执行回调函数,从而解决了跨域的数据请求。

优势是兼容性好,简单易用,支持浏览器与服务器双向通讯。缺点是只支持GET请求。

JSONPjson+padding(内填充),顾名思义,就是把JSON填充到一个盒子里

<script>
    function createJs(sUrl){
 
        var oScript = document.createElement('script');
        oScript.type = 'text/javascript';
        oScript.src = sUrl;
        document.getElementsByTagName('head')[0].appendChild(oScript);
    }
 
    createJs('jsonp.js');
 
    box({
       'name': 'test'
    });
 
    function box(json){
        alert(json.name);
    }
</script>
<script>
    function testjsonp(data) {
       console.log(data.name); // 获取返回的结果
    }
</script>
<script>
    var _script = document.createElement('script');
    _script.type = "text/javascript";
    _script.src = "http://localhost:8888/jsonp?callback=testjsonp";
    document.head.appendChild(_script);
</script>

缺点:

  一、这种方式没法发送post请求(这里)

  二、另外要肯定jsonp的请求是否失败并不容易,大多数框架的实现都是结合超时时间来断定。

跨域的4种方式:
①经过动态添加script标签,而后指定callback函数,能够获取到传过来的json数据,这时候要本身写一个callback函数来处理数据;
②使用jquery封装好的getJson方法,传入不一样域的url?callback=?,好处是不须要手动的插入script标签以及定义回掉函数。jquery会自动生成一个全局函数来替换callback=?中的问号,以后获取到数据后又会自动销毁,实际上就是起一个临时代理函数的做用。$.getJSON方法会自动判断是否跨域,不跨域的话,就调用普通的ajax方法;跨域的话,则会以异步加载js文件的形式来调用jsonp的回调函数。
③经过设置window.domain来处理跨域,可是只适用于不一样子域的框架间的交互。因此使用的时候能够用一个隐藏的iframe来作一个代理,让这个iframe载入一个与你想要经过ajax获取数据的目标页面处在相同的域的页面。
④window.name是能够跨域的。window.name的值只能是字符串的形式,这个字符串的大小最大能容许2M左右甚至更大的一个容量,具体取决于不一样的浏览器,但通常是够用了。因此能够转化成字符串的数据均可以使用window.name来传递,好比json数据。

做者:毕安
连接:https://www.jianshu.com/p/0e9a0d460f64
來源:简书
简书著做权归做者全部,任何形式的转载都请联系做者得到受权并注明出处。

 

十、建立ajax过程

    (1)建立`XMLHttpRequest`对象,也就是建立一个异步调用对象.
 
    (2)建立一个新的`HTTP`请求,并指定该`HTTP`请求的方法、`URL`及验证信息.
 
    (3)设置响应`HTTP`请求状态变化的函数.
 
    (4)发送`HTTP`请求.
 
    (5)获取异步调用返回的数据.
 
    (6)使用JavaScript和DOM实现局部刷新. 
 
    var xmlHttp = new XMLHttpRequest();
 
    xmlHttp.open('GET','demo.php','true');
 
    xmlHttp.send()
 
    xmlHttp.onreadystatechange = function(){
 
        if(xmlHttp.readyState === 4 & xmlHttp.status === 200){
 
        }
 
    }

十一、渐进加强和优雅降级

渐进加强 progressive enhancement :针对低版本浏览器进行构建页面,保证最基本的功能,而后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。

优雅降级graceful degradation :一开始就构建完整的功能,而后再针对低版本浏览器进行兼容。

区别:

a. 优雅降级是从复杂的现状开始,并试图减小用户体验的供给

b. 渐进加强则是从一个很是基础的,可以起做用的版本开始,并不断扩充,以适应将来环境的须要

c. 降级(功能衰减)意味着往回看;而渐进加强则意味着朝前看,同时保证其根基处于安全地带

12.解释下JavaScript中this是如何工做的。

this永远指向函数运行时所在的对象,而不是函数被建立时所在的对象。匿名函数或不处于任何对象中的函数指向window 。

  • 1.若是是call,apply,with,指定的this是谁,就是谁。

  • 2.普通的函数调用,函数被谁调用,this就是谁。

1三、HTTP和HTTPS

HTTP协议一般承载于TCP协议之上,在HTTPTCP之间添加一个安全协议层(SSLTSL),这个时候,就成了咱们常说的HTTPS。

默认HTTP的端口号为80,HTTPS的端口号为443。

为何HTTPS安全

由于网络请求须要中间有不少的服务器路由器的转发。中间的节点均可能篡改信息,而若是使用HTTPS,密钥在你和终点站才有。https之因此比http安全,是由于他利用ssl/tls协议传输。它包含证书,卸载,流量转发,负载均衡,页面适配,浏览器适配,refer传递等。保障了传输过程的安全性

1四、对前端模块化的认识

AMD 是 RequireJS 在推广过程当中对模块定义的规范化产出。

CMD 是 SeaJS 在推广过程当中对模块定义的规范化产出。

AMD 是提早执行,CMD 是延迟执行。

AMD推荐的风格经过返回一个对象作为模块对象,CommonJS的风格经过对module.exportsexports的属性赋值来达到暴露模块对象的目的。

1五、谈谈垃圾回收机制方式及内存管理

一、定义和用法:垃圾回收机制(GC:Garbage Collection),执行环境负责管理代码执行过程当中使用的内存。

二、原理:垃圾收集器会按期(周期性)找出那些不在继续使用的变量,而后释放其内存。可是这个过程不是实时的,由于其开销比较大,因此垃圾回收器会按照固定的时间间隔周期性的执行。

三、实例以下:

function fn1() {
    var obj = {name: 'hanzichi', age: 10};
}
function fn2() {
    var obj = {name:'hanzichi', age: 10};
   return obj;
}
var a = fn1();
var b = fn2();

fn1中定义的obj为局部变量,而当调用结束后,出了fn1的环境,那么该块内存会被js引擎中的垃圾回收器自动释放;在fn2被调用的过程当中,返回的对象被全局变量b所指向,因此该块内存并不会被释放。

 四、垃圾回收策略:标记清除(较为经常使用)和引用计数。

标记清除:

  定义和用法:当变量进入执行环境的时候,好比函数中声明一个变量,垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”。某一个时刻,垃圾回收器会过滤掉环境中的变量,以及被环境变量引用的变量(闭包),剩下的就是被视为准备回收的变量。

  到目前为止,IE、Firefox、Opera、Chrome、Safari的js实现使用的都是标记清除的垃圾回收策略或相似的策略,只不过垃圾收集的时间间隔互不相同。

引用计数:

  定义和用法:引用计数是跟踪记录每一个值被引用的次数。

  基本原理:就是变量的引用次数,被引用一次则加1,当这个引用计数为0时,被视为准备回收的对象。

 

  在低版本IE中常常会出现内存泄露,不少时候就是由于其采用引用计数方式进行垃圾回收。

  在IE中虽然JavaScript对象经过标记清除的方式进行垃圾回收,但BOM与DOM对象倒是经过引用计数回收垃圾的, 
  也就是说只要涉及BOM及DOM就会出现循环引用问题。

内存管理

一、何时触发垃圾回收?

垃圾回收器周期性运行,若是分配的内存很是多,那么回收工做也会很艰巨,肯定垃圾回收时间间隔就变成了一个值得思考的问题。

IE6的垃圾回收是根据内存分配量运行的,当环境中的变量,对象,字符串达到必定数量时触发垃圾回收。垃圾回收器一直处于工做状态,严重影响浏览器性能。

IE7中,垃圾回收器会根据内存分配量与程序占用内存的比例进行动态调整,开始回收工做。

二、合理的GC方案:(1)、遍历全部可访问的对象; (2)、回收已不可访问的对象。

三、GC缺陷:(1)、中止响应其余操做;

四、GC优化策略:(1)、分代回收(Generation GC);(2)、增量GC

1六、你以为前端工程的价值体如今哪

为简化用户使用提供技术支持(交互部分) 
为多个浏览器兼容性提供支持 
为提升用户浏览速度(浏览器性能)提供支持 
为跨平台或者其余基于webkit或其余渲染引擎的应用提供支持 
为展现数据提供支持(数据接口)
前端是最贴近用户的程序员,比后端、数据库、产品经理、运营、安全都近。
 
    1、实现界面交互
 
    2、提高用户体验
 
    3、有了Node.js,前端能够实现服务端的一些事情
参与项目,快速高质量完成实现效果图,精确到1px;
 
 与团队成员,UI设计,产品经理的沟通;
 
 作好的页面结构,页面重构和用户体验;
 
 处理hack,兼容、写出优美的代码格式;
 
 针对服务器的优化、拥抱最新前端技术。

1七、谈谈性能优化问题

代码层面:避免使用css表达式,避免使用高级选择器,通配选择器。

缓存利用:缓存Ajax,使用CDN,使用外部js和css文件以便缓存,添加Expires头,服务端配置Etag,减小DNS查找等

请求数量:合并样式和脚本,使用css图片精灵,初始首屏以外的图片资源按需加载,静态资源延迟加载。

请求带宽:压缩文件,开启GZIP,

内容方面:

1.减小 HTTP 请求 (Make Fewer HTTP Requests)

2.减小 DOM 元素数量 (Reduce the Number of DOM Elements)

3.使得 Ajax 可缓存 (Make Ajax Cacheable)

针对CSS:

1.把 CSS 放到代码页上端 (Put Stylesheets at the Top)

2.从页面中剥离 JavaScript 与 CSS (Make JavaScript and CSS External)

3.精简 JavaScript 与 CSS (Minify JavaScript and CSS)

4.避免 CSS 表达式 (Avoid CSS Expressions)

针对JavaScript :

1. 脚本放到 HTML 代码页底部 (Put Scripts at the Bottom)

2. 从页面中剥离 JavaScript 与 CSS (Make JavaScript and CSS External)

3. 精简 JavaScript 与 CSS (Minify JavaScript and CSS)

4. 移除重复脚本 (Remove Duplicate Scripts)

面向图片(Image):

1.优化图片

2 不要在 HTML 中使用缩放图片

3 使用恰当的图片格式

4 使用 CSS Sprites 技巧对图片优化

移动端性能优化

  • 尽可能使用css3动画,开启硬件加速。
  • 适当使用touch事件代替click事件。
  • 避免使用css3渐变阴影效果。
  • 能够用transform: translateZ(0)来开启硬件加速。
  • 不滥用Float。Float在渲染时计算量比较大,尽可能减小使用
  • 不滥用Web字体。Web字体须要下载,解析,重绘当前页面,尽可能减小使用。
  • 合理使用requestAnimationFrame动画代替setTimeout
  • CSS中的属性(CSS3 transitions、CSS3 3D transforms、Opacity、Canvas、WebGL、Video)会触发GPU渲染,请合理使用。过渡使用会引起手机过耗电增长

相关阅读:如何作到一秒渲染一个移动页面

1.合并js、css文件,减小http请求
2. 减小 DNS 查找
3. 避免重定向
4. 使用 Ajax 缓存
5. 延迟载入组件
6. 预先载入组件
7.
  • 减小dom操做,尽量用变量替代没必要要的dom操做
8. 切分组件到多个域
9. 最小化 iframe 的数量
10. 不要出现http 404 错误
11.压缩css、js文件,外部js、css文件放在最底下

1八、什么是Etag?讲讲304缓存的原理

服务器首先产生ETag,服务器可在稍后使用它来判断页面是否已经被修改。本质上,客户端经过将该记号传回服务器要求服务器验证其(客户端)缓存。

304是HTTP状态码,服务器用来标识这个文件没修改,不返回内容,浏览器在接收到个状态码后,会使用浏览器已缓存的文件

客户端请求一个页面(A)。 服务器返回页面A,并在给A加上一个ETag。 客户端展示该页面,并将页面连同ETag一块儿缓存。 客户再次请求页面A,并将上次请求时服务器返回的ETag一块儿传递给服务器。 服务器检查该ETag,并判断出该页面自上次客户端请求以后还未被修改,直接返回响应304(未修改——Not Modified)和一个空的响应体。

1九、栈和队列、堆的区别?

栈的插入和删除操做都是在一端进行的,而队列的操做倒是在两端进行的。
 
队列先进先出,栈先进后出。
 
栈只容许在表尾一端进行插入和删除,而队列只容许在表尾一端进行插入,在表头一端进行删除
栈区(stack)—   由编译器自动分配释放   ,存放函数的参数值,局部变量的值等。
 
堆区(heap)   —   通常由程序员分配释放,   若程序员不释放,程序结束时可能由OS回收。
 
堆(数据结构):堆能够被当作是一棵树,如:堆排序;
 
栈(数据结构):一种先进后出的数据结构

20、你以为jQuery源码有哪些写的好的地方

源码封装在一个匿名函数的自执行环境中,有助于防止变量的全局污染,而后经过传入window对象参数,能够使window对象做为局部变量使用,好处是当中访问window对象的时候,
就不用将做用域链退回到顶层做用域了,从而能够更快的访问对象。一样,传入参数,能够缩短查找undefined时的做用域链。jQueryjquerywindowundefined
(function( window, undefined ) {
 
         //用一个函数域包起来,就是所谓的沙箱
 
         //在这里边var定义的变量,属于这个函数域内的局部变量,避免污染全局
 
         //把当前沙箱须要的外部变量经过函数参数引入进来
 
         //只要保证参数对内提供的接口的一致性,你还能够随意替换传进来的这个参数
 
        window.jQuery = window.$ = jQuery;
 
    })( window );

jquery将一些原型属性和方法封装在了jquery.prototype中,为了缩短名称,又赋值给了jquery.fn,这是很形象的写法。

有一些数组或对象的方法常常能使用到,jQuery将其保存为局部变量以提升访问速度。

jquery实现的链式调用能够节约代码,所返回的都是同一个对象,能够提升代码效率。

2一、ES6的了解

新增模板字符串(为JavaScript提供了简单的字符串插值功能)、箭头函数(操做符左边为输入的参数,而右边则是进行的操做以及返回的值。)
(用来遍历数据—例如数组中的值。)对象可被不定参数和默认参数完美代替。
将对象归入规范,提供了原生的对象。增长了和命令,用来声明变量。增长了块级做用域。let命令实际上就增长了块级做用域。
ES6规定,命令和命令声明的全局变量,属于全局对象的属性;命令、命令、命令声明的全局变量,不属于全局对象的属性。。还有就是引入模块的概念Inputs=>outputsfor-ofargumentsES6promisePromiseletconstvarfunctionletconstclassmodule

2二、”attribute”和”property”的区别是什么?

1.定义

Property:属性,全部的HTML元素都由HTMLElement类型表示,HTMLElement类型直接继承自Element并添加了一些属性,添加的这些属性分别对应于每一个HTML元素都有下面的这5个标准特性: id,title,lang,dir,className。DOM节点是一个对象,所以,他能够和其余的JavaScript对象同样添加自定义的属性以及方法。property的值能够是任何的数据类型,对大小写敏感,自定义的property不会出如今html代码中,只存在js中。

Attribute:特性,区别于property,attribute只能是字符串,大小写不敏感,出如今innerHTML中,经过类数组attributes能够罗列全部的attribute。

2.相同之处

标准的 DOM properties 与 attributes 是同步的。公认的(非自定义的)特性会被以属性的形式添加到DOM对象中。如,id,align,style等,这时候操做property或者使用操做特性的DOM方法如getAttribute()均可以操做属性。不过传递给getAttribute()的特性名与实际的特性名相同。所以对于class的特性值获取的时候要传入“class”。

3.不一样之处

1).对于有些标准的特性的操做,getAttribute与点号(.)获取的值存在差别性。如href,src,value,style,onclick等事件处理程序。 
2).href:getAttribute获取的是href的实际值,而点号获取的是完整的url,存在浏览器差别。

2三、行内元素有哪些?块级元素有哪些?CSS盒模型

块级元素:div,p,ol,ul,form,h1-h6,textarea,html,body,table,button,hr,dl,address,pre
行内块元素:img,input,td
行内元素:span,a,b,a,strong,em,title,lable,br

2四、link和@import的区别

就结论而言,强烈建议使用link标签,慎用@import方式。
这样能够避免考虑@import的语法规则和注意事项,避免产生资源文件下载顺序混乱和http请求过多的烦恼。

区别

1.从属关系区别
@import是 CSS 提供的语法规则,只有导入样式表的做用;link是HTML提供的标签,不只能够加载 CSS 文件,还能够定义 RSS、rel 链接属性等。

2.加载顺序区别
加载页面时,link标签引入的 CSS 被同时加载;@import引入的 CSS 将在页面加载完毕后被加载。
@import虽然后被加载,却会在加载完毕后置于样式表顶部,最终渲染时天然会被下面的同名样式层叠。
3.兼容性区别 @import是 CSS2.1 才有的语法,故只可在 IE5+ 才能识别;link标签做为 HTML 元素,不存在兼容性问题。 

4.DOM可控性区别 能够经过 JS 操做 DOM ,插入link标签来改变样式;因为 DOM 方法是基于文档的,没法使用@import的方式插入样式。

由link和@import的区别引起的CSS渲染杂谈

2五、CSS选择器有哪些?优先级怎么样?

    1.id选择器( # myid) 
    2.类选择器(.myclassname) 
    3.标签选择器(div, h1, p) 
    4.相邻选择器(h1 + p) 
    5.子选择器(ul > li) 
    6.后代选择器(li a) 
    7.通配符选择器( *8.属性选择器(a[rel = "external"]) 
    9.伪类选择器(a: hover, li:nth-child)

优先级为:!important > id > class > tag

2六、主流浏览器及其内核?

常见的浏览器内核(或者说渲染引擎)有不少个,如Trident、Gecko、WebKit等等,不一样的内核对网页编写语法的解释也有不一样,进而致使同一个页面在不一样内核的浏览器下显示出来的效果也会有所出入,这也是前端工程师须要让做品兼容各类浏览器的缘由。

 IE:Trident;Safari:WebKit;谷歌Chrome/Chromium:WebKit/Blink;Opera:Presto;Firefox:Gecko

1、IE浏览器内核:Trident内核,也被称为IE内核; 
2、Chrome浏览器内核:Chromium内核 → Webkit内核 → Blink内核; 
3、Firefox浏览器内核:Gecko内核,也被称Firefox内核; 
4、Safari浏览器内核:Webkit内核; 
5、Opera浏览器内核:最初是自主研发的Presto内核,后跟随谷歌,从Webkit到Blink内核; 
6、360浏览器、猎豹浏览器内核:IE+Chrome双内核; 
7、搜狗、遨游、QQ浏览器内核:Trident(兼容模式)+Webkit(高速模式); 
8、百度浏览器、世界之窗内核:IE内核;

各主流浏览器内核介绍

2七、常见兼容性问题?

(1)图片间隙

描述:在div中插入图片时,图片会将div下方撑大三像素。

解决方法:添加声明:display:block;
(2)双倍浮向(双倍边距)

描述:当Ie6及更低版本浏览器在解析浮动元素时,会错误地把浮向边边界加倍显示。 
hack:给浮动元素添加声明:display:inline

(3)默认高度(IE6)

描述:在IE6及如下版本中,部分块元素拥有默认高度(低于18px高度) 
hack1:给元素添加声明:font-size:0; 
hack2:给元素添加声明:overflow:hidden;

png24位的图片在iE6浏览器上出现背景,解决方案是作成PNG8.也能够引用一段脚本处理.
 
浏览器默认的margin和padding不一样。解决方案是加一个全局的*{margin:0;padding:0;}来统一。
 
IE6双边距bug:块属性标签float后,又有横行的margin状况下,在ie6显示margin比设置的大。
 
浮动ie产生的双倍距离(IE6双边距问题:在IE6下,若是对元素设置了浮动,同时又设置了margin-left或margin-right,margin值会加倍。)
 
#box{ float:left; width:10px; margin:0 0 0 100px;}
 
这种状况之下IE会产生20px的距离,解决方案是在float的标签样式控制中加入
_display:inline;将其转化为行内属性。(_这个符号只有ie6会识别)
 
渐进识别的方式,从整体中逐渐排除局部。 
 
  首先,巧妙的使用“\9”这一标记,将IE游览器从全部状况中分离出来。
 
  接着,再次使用“+”将IE8和IE七、IE6分离开来,这样IE8已经独立识别。
 
  css
 
      .bb{
 
       background-color:#f1ee18;/*全部识别*/
 
      .background-color:#00deff\9; /*IE六、七、8识别*/
 
      +background-color:#a200ff;/*IE六、7识别*/
 
      _background-color:#1e0bd1;/*IE6识别*/
 
      } 
 
怪异模式问题:漏写DTD声明,Firefox仍然会按照标准模式来解析网页,但在IE中会触发
怪异模式。为避免怪异模式给咱们带来没必要要的麻烦,最好养成书写DTD声明的好习惯。如今
能够使用[html5](http://www.w3.org/TR/html5/single-page.html)推荐的写法:`<doctype html>

2八、解释下浮动和它的工做原理?清除浮动的技巧

关于浮动咱们须要了解,浮动的框能够向左或向右移动,直到它的外边缘碰到包含框或另外一个浮动框的边框为止。要想使元素浮动,必须为元素设置一个宽度(width)。虽然浮动元素不是文档流之中,可是它浮动后所处的位置依然是在浮动以前的水平方向上。因为浮动框不在文档的普通流中,因此文档的普通流中的块框表现得就像浮动框不存在同样,下面的元素填补原来的位置。有些元素会在浮动元素的下方,可是这些元素的内容并不必定会被浮动的元素所遮盖,对内联元素进行定位时,这些元素会考虑浮动元素的边界,会围绕着浮动元素放置。也能够把浮动元素想象成是被块元素忽略的元素,而内联元素会关注浮动元素的。

1.使用空标签清除浮动。 
   这种方法是在全部浮动标签后面添加一个空标签 定义css clear:both. 弊端就是增长了无心义标签。
 
2.使用overflow。 
   给包含浮动元素的父标签添加css属性 overflow:auto; zoom:1; zoom:1用于兼容IE6。
 
3.使用after伪对象清除浮动。
 
   该方法只适用于非IE浏览器。具体写法可参照如下示例。使用中需注意如下几点。1、该方法中必须为须要清除浮动元素的伪对象中设置 height:0,不然该元素会比实际高出若干像素;

CSS技巧(一):清除浮动 

2九、JS中IE的几种兼容性写法?CSS中兼容性写法?IE与其余浏览器有哪些不一样?

Var ev = ev || window.event
document.documentElement.clientWidth || document.body.clientWidth
Var target = ev.srcElement||ev.target
//CSS兼容性写法
-webkit- ,针对safari,chrome浏览器的内核CSS写法
-moz-,针对firefox浏览器的内核CSS写法
-ms-,针对ie内核的CSS写法
-o-,针对Opera内核的CSS写法
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如下不支持圆角
js兼容性问题:①在标准的事件绑定中绑定事件的方法函数为addEventListener,而IE使用的是attachEvent;②事件处理中event属性的获取不一样。标准浏览器是做为参数带入,而后经过e.target获取目标元素;而IE是经过window.event方式得到,经过e.srcElement获取目标元素;

30、说一下zoom:1的原理

参考:说一下zoom:1的原理,万一被问到呢?

3一、get和post的区别?什么时候使用POST? 

    GET:通常用于信息获取,使用URL传递参数,对所发送信息的数量也有限制,通常在2000个字符
 
    POST:通常用于修改服务器上的资源,对所发送的信息没有限制。 
 
    GET方式须要使用Request.QueryString来取得变量的值,而POST方式经过Request.Form来获取变量的值,
 
    也就是说Get是经过地址栏来传值,而Post是经过提交表单来传值。 
 
然而,在如下状况中,请使用 POST 请求:
 
没法使用缓存文件(更新服务器上的文件或数据库)
 
向服务器发送大量数据(POST 没有数据量限制)
 
发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠

3二、ajax如何解释json数据?

3三、js继承方式及其优缺点

原型链继承的缺点:一是字面量重写原型会中断关系,使用引用类型的原型,而且子类型还没法给超类型传递参数。
借用构造函数(类式继承)

javascript继承的6种方法

面向对象的基本特征有:封闭、继承、多态。

1,原型链继承
 
2,借用构造函数继承
 
3,组合继承(原型+借用构造)
 
4,原型式继承
 
5,寄生式继承
 
6,寄生组合式继承

34.什么是哈希表?

散列表(也叫哈希表),是根据关键码值直接进行访问的数据结构。也就是说,它经过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫作散列函数,存放记录的数组叫作散列表。

3五、什么是事件冒泡和默认事件?如何阻止?

 1. 咱们在网页中的某个操做(有的操做对应多个事件)。例如:当咱们点击一个按钮就会产生一个事件。是能够被 JavaScript 侦测到的行为。
 
 2. 事件处理机制:IE是事件冒泡、firefox同时支持两种事件模型,也就是:捕获型事件和冒泡型事件。;

//阻止事件冒泡
 
 `ev.stopPropagation()`;注意旧ie的方法 `ev.cancelBubble = true`;

3六、javascript的本地对象/原生对象、内置对象和宿主对象?

原生对象

ECMA-262 把本地对象(native object)定义为“独立于宿主环境的 ECMAScript 实现提供的对象”。

“本地对象”包含哪些内容:Object、Function、Array、String、Boolean、Number、Date、RegExp、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError。

由此能够看出,简单来讲,本地对象就是 ECMA-262 定义的类(引用类型)。

内置对象

ECMA-262 把内置对象(built-in object)定义为“由 ECMAScript 实现提供的、独立于宿主环境的全部对象,在 ECMAScript 程序开始执行时出现”。这意味着开发者没必要明确实例化内置对象,它已被实例化了。

一样是“独立于宿主环境”。根据定义咱们彷佛很难分清“内置对象”与“本地对象”的区别。而ECMA-262 只定义了两个内置对象,即 Global 和 Math (它们也是本地对象,根据定义,每一个内置对象都是本地对象)。如此就能够理解了。内置对象是本地对象的一种。

宿主对象

何为“宿主对象”?主要在这个“宿主”的概念上,ECMAScript中的“宿主”固然就是咱们网页的运行环境,即“操做系统”和“浏览器”。

全部非本地对象都是宿主对象(host object),即由 ECMAScript 实现的宿主环境提供的对象。全部的BOM和DOM都是宿主对象。由于其对于不一样的“宿主”环境所展现的内容不一样。其实说白了就是,ECMAScript官方未定义的对象都属于宿主对象,由于其未定义的对象大多数是本身经过ECMAScript程序建立的对象。

3七、Document.onload与ready的区别?

共同点:这两种事件都表明的是页面文档加载时触发。

异同点:

ready 事件的触发,表示文档结构已经加载完成(不包含图片等非文字媒体文件)。

onload 事件的触发,表示页面包含图片等文件在内的全部元素都加载完成。

3八、javascript的同源策略 

概念:同源策略是客户端脚本(尤为是Javascript)的重要的安全度量标准。它最先出自Netscape Navigator2.0,其目的是防止某个文档或脚本从多个不一样源装载。

这里的同源策略指的是:协议,域名,端口相同,同源策略是一种安全协议。

指一段脚本只能读取来自同一来源的窗口和文档的属性。

为何要有同源限制?

咱们举例说明:好比一个黑客程序,他利用Iframe把真正的银行登陆页面嵌到他的页面上,当你使用真实的用户名,密码登陆时,他的页面就能够经过Javascript读取到你的表单中input中的内容,这样用户名,密码就轻松到手了。

缺点:

如今网站的JS 都会进行压缩,一些文件用了严格模式,而另外一些没有。这时这些原本是严格模式的文件,被 merge 后,这个串就到了文件的中间,不只没有指示严格模式,反而在压缩后浪费了字节。

3九、请你谈谈Cookie的优势和弊端,以及替换方法

cookie虽然在持久保存客户端数据提供了方便,分担了服务器存储的负担,但仍是有不少局限性的。

第一:每一个特定的域名下生成cookie的数量有限

EOpera 会清理近期最少使用的cookieFirefox会随机清理cookie

cookie的最大大约为4096字节,为了兼容性,通常不能超过4095字节。

第二:安全性问题。若是cookie被人拦截了,那人就能够取得全部的session信息。即便加密也与事无补,由于拦截者并不须要知道cookie的意义,他只要原样转发cookie就能够达到目的了。

40、display:nonevisibility:hidden的区别?

display:none 隐藏对应的元素,在文档布局中再也不给它分配空间,它各边的元素会合拢,就当他历来不存在。 

visibility:hidden 隐藏对应的元素,可是在文档布局中仍保留原来的空间。

  • display:none;的缺陷搜索引擎可能认为被隐藏的文字属于垃圾信息而被忽略屏幕阅读器(是为视觉上有障碍的人设计的读取屏幕内容的程序)会忽略被隐藏的文字。

  • visibility:hidden;的缺陷这个你们应该比较熟悉就是隐藏的内容会占据他所应该占据物理空间3.overflow:hidden;一个比较合理的方法.texthidden{display:block;/统一转化为块级元素/overflow:hidden;width:0;height:0;}就像上面的一段CSS所展现的方法,将宽度和高度设定为0,而后超过部分隐藏,就会弥补上述1、二方法中的缺陷,也达到了隐藏内容的目的。

40、position:absolutefloat属性的异同

  • 共同点:对内联元素设置floatabsolute属性,可让元素脱离文档流,而且能够设置其宽高。

  • 不一样点:float属于浮动流模型,仍会占据位置,absolute属于层模型,会覆盖文档流中的其余元素。

4一、介绍一下box-sizing属性?

box-sizing属性主要用来控制元素的盒模型的解析模式。默认值是content-box

  • content-box:让元素维持W3C的标准盒模型。元素的宽度/高度由border + padding + content的宽度/高度决定,设置width/height属性指的是content部分的宽/高

  • border-box:让元素维持IE传统盒模型(IE6如下版本和IE6~7的怪异模式)。设置width/height属性指的是border + padding + content

标准浏览器下,按照W3C规范对盒模型解析,一旦修改了元素的边框或内距,就会影响元素的盒子尺寸,就不得不从新计算元素的盒子尺寸,从而影响整个页面的布局。

4二、CSS3有哪些新特性?

CSS3实现圆角(border-radius),阴影(box-shadow),
 
对文字加特效(text-shadow、),线性渐变(gradient),旋转(transform)
 
transform:rotate(9deg) scale(0.85,0.90) translate(0px,-30px) skew(-9deg,0deg);//旋转,缩放,定位,倾斜
 
增长了更多的CSS选择器  多背景 rgba
 
在CSS3中惟一引入的伪元素是::selection.
 
媒体查询,多栏布局
 
border-image

4三、对BFC规范的理解?

BFC,块级格式化上下文,一个建立了新的BFC的盒子是独立布局的,盒子里面的子元素的样式不会影响到外面的元素。在同一个BFC中的两个毗邻的块级盒在垂直方向(和布局方向有关系)的margin会发生折叠。 

 

W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行布局,以及与其余元素的关系和相互做用。

4四、Doctype做用? 严格模式与混杂模式如何区分?它们有何意义?

1)<!DOCTYPE> 声明位于文档中的最前面,处于 <html> 标签以前。告知浏览器以何种模式来渲染文档。

2)、严格模式的排版和 JS 运做模式是 以该浏览器支持的最高标准运行。

3)、在混杂模式中,页面以宽松的向后兼容的方式显示。模拟老式浏览器的行为以防止站点没法工做。

4)、DOCTYPE不存在或格式不正确会致使文档以混杂模式呈现。

此标签可告知浏览器文档使用哪一种HTML或XHTML规范。该标签可声明三种DTD类型,分别表示严格版本、过渡版本以及基于框架的HTML文档。

HTML 4.01规定了三种文档类型:Strict、Transitional以及Frameset。

XHTML 1.0规定了三种XML文档类型:Strict、Transitional以及Frameset。

Standards(标准)模式(也就是严格呈现模式)用于呈现遵循最新标准的网页,而Quirks(包容)模式(也就是松散呈现模式或者兼容模式)用于呈现为传统浏览器而设计的网页。

浏览器标准模式和怪异模式之间的区别

W3C标准推出之后,浏览器都开始采纳新标准,但存在一个问题就是如何保证旧的网页还能继续浏览,在标准出来之前,不少页面都是根据旧的渲染方法编写的,若是用的标准来渲染,将致使页面显示异常。为保持浏览器渲染的兼容性,使之前的页面可以正常浏览,浏览器都保留了旧的渲染方法(如:微软的IE)。这样浏览器渲染上就产生了Quircks mode和Standars mode,两种渲染方法共存在一个浏览器上。IE盒子模型和标准W3C盒子模型:ie的width包括:padding\border。标准的width不包括:padding\border

在js中如何判断当前浏览器正在以何种方式解析? 
document对象有个属性compatMode,它有两个值:BackCompat对应quirks mode,CSS1Compat对应strict mode。

4五、HTML与XHTML——两者有什么区别

1.全部的标记都必需要有一个相应的结束标记
 
2.全部标签的元素和属性的名字都必须使用小写
 
3.全部的XML标记都必须合理嵌套
 
4.全部的属性必须用引号""括起来
 
5.把全部<和&特殊符号用编码表示
 
6.给全部属性赋一个值
 
7.不要在注释内容中使“--8.图片必须有说明文字

4六、DOM操做——怎样添加、移除、移动、复制、建立和查找节点。

      createDocumentFragment()    //建立一个DOM片断 
      createElement()   //建立一个具体的元素 
      createTextNode()   //建立一个文本节点
//添加、移除、替换、插入
     appendChild() 
      removeChild() 
      replaceChild() 
      insertBefore() //并无insertAfter()
//查找
     getElementsByTagName()    //经过标签名称 
      getElementsByName()    //经过元素的Name属性的值(IE容错能力较强,会获得一个数组,其中包括id等于name值的) 
      getElementById()    //经过元素Id,惟一性    

4七、html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5?

  HTML5 如今已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增长。
 
  拖拽释放(Drag and drop) API
 
  语义化更好的内容标签(header,nav,footer,aside,article,section)
 
  音频、视频API(audio,video)
 
  画布(Canvas) API
 
  地理(Geolocation) API
 
  本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失;
 
  sessionStorage 的数据在浏览器关闭后自动删除 
 
  表单控件,calendar、date、time、email、url、search
 
  新的技术webworker, websocket, Geolocation

//移除的元素
纯表现的元素:basefont,big,center,font, s,strike,tt,u;
 
对可用性产生负面影响的元素:frame,frameset,noframes;
//支持HTML5新标签:
IE8/IE7/IE6支持经过document.createElement方法产生的标签,
 
    能够利用这一特性让这些浏览器支持HTML5新标签,固然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架
 
       <!--[if lt IE 9]>
       <script> src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script>
       <![endif]-->

4八、描述如下变量的区别:null,undefined或undeclared?

JavaScript的最第一版本是这样区分的:null是一个表示”无”的对象,转为数值时为0;undefined是一个表示”无”的原始值,转为数值时为NaN。

可是,上面这样的区分,在实践中很快就被证实不可行。目前,null和undefined基本是同义的,只有一些细微的差异。

null表示”没有对象”,即该处不该该有值。null用来表示还没有存在的对象,经常使用来表示函数企图返回一个不存在的对象。典型用法是:

用来初始化一个变量,这个变量可能被赋值为一个对象。

用来和一个已经初始化的变量比较,这个变量能够是也能够不是一个对象。

当函数的参数指望是对象时,被用做参数传入。

当函数的返回值指望是对象时,被用做返回值传出。

做为对象原型链的终点。 
undefined表示”缺乏值”,就是此处应该有一个值,可是尚未定义。典型用法是:

变量被声明了,但没有赋值时,就等于undefined。

调用函数时,应该提供的参数没有提供,该参数等于undefined。

对象没有赋值的属性,该属性的值为undefined。

函数没有返回值时,默认返回undefined。

==运算符将二者看做相等。若是要区分二者,要使用===或typeof运算符。

4九、异步加载和延迟加载

defer和async、动态建立DOM方式(建立script,插入到DOM中,加载完毕后callBack)、按需异步载入js

1.异步加载的方案: 动态插入script标签
 
2.经过ajax去获取js代码,而后经过eval执行
 
3.script标签上添加defer或者async属性
 
4.建立并插入iframe,让它异步执行js
 
5.延迟加载:有些 js 代码并非页面初始化的时候就马上须要的,而稍后的某些状况才须要的。

50、开发过程当中遇到的内存泄露状况,如何解决的?

一、定义和用法:

内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束。C#和Java等语言采用了自动垃圾回收方法管理内存,几乎不会发生内存泄露。咱们知道,浏览器中也是采用自动垃圾回收方法管理内存,但因为浏览器垃圾回收方法有bug,会产生内存泄露。

二、内存泄露的几种状况:

(1)、当页面中元素被移除或替换时,若元素绑定的事件仍没被移除,在IE中不会做出恰当处理,此时要先手工移除事件,否则会存在内存泄露。

实例以下:

<div id="myDiv">
    <input type="button" value="Click me" id="myBtn">
</div>
<script type="text/javascript">
    var btn = document.getElementById("myBtn");
    btn.onclick = function(){
        document.getElementById("myDiv").innerHTML = "Processing...";
    }
</script>

解决方法以下:

<div id="myDiv">
    <input type="button" value="Click me" id="myBtn">
</div>
<script type="text/javascript">
    var btn = document.getElementById("myBtn");
    btn.onclick = function(){
    btn.onclick = null;
        document.getElementById("myDiv").innerHTML = "Processing...";
    }
</script>
(2)、因为是函数内定义函数,而且内部函数--事件回调的引用外暴了,造成了闭包。闭包能够维持函数内局部变量,使其得不到释放。
实例以下:
function bindEvent(){
    var obj=document.createElement("XXX");
    obj.onclick=function(){
        //Even if it's a empty function
    }
}

解决方法以下:

function bindEvent(){
    var obj=document.createElement("XXX");
    obj.onclick=function(){
         //Even if it's a empty function
    }
    obj=null;
}
 setTimeout 的第一个参数使用字符串而非函数的话,会引起内存泄漏。
 
闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)

5一、一个页面从输入 URL 到页面加载显示完成,这个过程当中都发生了什么?

分为4个步骤:
    (1)当发送一个URL请求时,无论这个URL是Web页面的URL仍是Web页面上每一个资源的URL,浏览器都会开启一个线程来处理这个请求,同时在远程DNS服务器上启动一个DNS查询。这能使浏览器得到请求对应的IP地址。 
    (2)浏览器与远程`Web`服务器经过`TCP`三次握手协商来创建一个`TCP/IP`链接。该握手包括一个同步报文,一个同步-应答报文和一个应答报文,这三个报文在 浏览器和服务器之间传递。该握手首先由客户端尝试创建起通讯,然后服务器应答并接受客户端的请求,最后由客户端发出该请求已经被接受的报文。 
    (3)一旦`TCP/IP`链接创建,浏览器会经过该链接向远程服务器发送`HTTP`的`GET`请求。远程服务器找到资源并使用HTTP响应返回该资源,值为200的HTTP响应状态表示一个正确的响应。 
    (4)此时,`Web`服务器提供资源服务,客户端开始下载资源。
请求返回后,便进入了咱们关注的前端模块 
简单来讲,浏览器会解析`HTML`生成`DOM Tree`,其次会根据CSS生成CSS Rule Tree,而`javascript`又能够根据`DOM API`操做`DOM`

5二、javascript对象的几种建立方式

1,工厂模式
 
2,构造函数模式
 
3,原型模式
 
4,混合构造函数和原型模式
 
5,动态原型模式
 
6,寄生构造函数模式
 
7,稳妥构造函数模式

5三、ie各版本和chrome能够并行下载多少个资源

IE6 两个并发,iE7升级以后的6个并发,以后版本也是6个
Firefox,chrome也是6个

5四、call和apply的区别和做用

做用:都是在特定的做用域中调用函数,等于设置函数体内this对象的值,以扩充函数赖以运行的做用域。都会改变this的指向。

  • apply()方法 接收两个参数,一个是函数运行的做用域(this),另外一个是参数数组。
  • call()方法 第一个参数和apply()方法的同样,可是传递给函数的参数必须列举出来。

call方法: 
语法:call(thisObj,Object) 
定义:调用一个对象的一个方法,以另外一个对象替换当前对象。 
说明:call 方法能够用来代替另外一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 若是没有提供 thisObj 参数,那么 Global 对象被用做 thisObj。 
apply方法: 
语法:apply(thisObj,[argArray]) 
定义:应用某一对象的一个方法,用另外一个对象替换当前对象。 
说明:若是 argArray 不是一个有效的数组或者不是 arguments 对象,那么将致使一个 TypeError。若是没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用做 thisObj, 而且没法被传递任何参数。

对于apply和call二者在做用上是相同的,但二者在参数上有如下区别: 
对于第一个参数意义都同样,但对第二个参数:apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则做为call的参数传入(从第二个参数开始)。如 func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3])同时使用apply的好处是能够直接将当前函数的arguments对象做为apply的第二个参数传入。

JS中的call()方法和apply()方法用法总结

5五、ajax的缺点和在IE下的问题?

  //ajax的缺点
  1、ajax不支持浏览器back按钮。
 
  2、安全问题 AJAX暴露了与服务器交互的细节。
 
  3、对搜索引擎的支持比较弱。
 
  4、破坏了程序的异常机制。
 
  5、不容易调试。

//IE缓存问题
/*在IE浏览器下,若是请求的方法是GET,而且请求的URL不变,那么这个请求的结果就会被缓存。解决这个问题的办法能够经过实时改变请求的URL,只要URL改变,就不会被缓存,
能够经过在URL末尾添加上随机的时间戳参数('t'= + new Date().getTime())
或者:*/
open('GET','demo.php?rand=+Math.random()',true);
//Ajax请求的页面历史记录状态问题
能够经过锚点来记录状态,location.hash。让浏览器记录Ajax请求时页面状态的变化。

还能够经过HTML5的history.pushState,来实现浏览器地址栏的无刷新改变

定义和用法:

AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。Ajax 是一种用于建立快速动态网页的技术。Ajax 是一种在无需从新加载整个网页的状况下,可以更新部分网页的技术。

传统的网页(不使用 Ajax)若是须要更新内容,必须重载整个网页页面。

优势:

1.减轻服务器的负担,按需取数据,最大程度的减小冗余请求

2.局部刷新页面,减小用户心理和实际的等待时间,带来更好的用户体验

3.基于xml标准化,并被普遍支持,不需安装插件等,进一步促进页面和数据的分离

缺点:

1.AJAX大量的使用了javascript和ajax引擎,这些取决于浏览器的支持.在编写的时候考虑对浏览器的兼容性.

2.AJAX只是局部刷新,因此页面的后退按钮是没有用的.

3.对流媒体还有移动设备的支持不是太好等

AJAX的工做原理:

1.建立ajax对象(XMLHttpRequest/ActiveXObject(Microsoft.XMLHttp))

2.判断数据传输方式(GET/POST)

3.打开连接 open()

4.发送 send()

5.当ajax对象完成第四步(onreadystatechange)数据接收完成,判断http响应状态(status)200-300之间或者304(缓存)执行回调函数

5六、谈谈你对重构的理解

网站重构:在不改变外部行为的前提下,简化结构、添加可读性,而在网站前端保持一致的行为。也就是说是在不改变UI的状况下,对网站进行优化, 
在扩展的同时保持一致的UI。

对于传统的网站来讲重构一般是:
 
表格(table)布局改成DIV+CSS
 
使网站前端兼容于现代浏览器(针对于不合规范的CSS、如对IE6有效的)
 
对于移动平台的优化
 
针对于SEO进行优化
 
深层次的网站重构应该考虑的方面 
 
减小代码间的耦合
 
让代码保持弹性
 
严格按规范编写代码
 
设计可扩展的API
 
代替旧有的框架、语言(如VB)
 
加强用户体验
 
一般来讲对于速度的优化也包含在重构中 
 
压缩JS、CSS、image等前端资源(一般是由服务器来解决)
 
程序的性能优化(如数据读写)
 
采用CDN来加速资源加载
 
对于JS DOM的优化
 
HTTP服务器的文件缓存

5七、说说你对Promise的理解

依照 Promise/A+ 的定义,Promise 有四种状态:
pending: 初始状态, 非 fulfilled 或 rejected.
fulfilled: 成功的操做.
rejected: 失败的操做.
settled: Promise已被fulfilled或rejected,且不是pending
另外, fulfilled 与 rejected 一块儿合称 settled。

Promise 对象用来进行延迟(deferred) 和异步(asynchronous ) 计算。
Promise 的构造函数
构造一个 Promise,最基本的用法以下:

var promise = new Promise(function(resolve, reject) {
 
        if (...) {  // succeed
 
            resolve(result);
 
        } else {   // fails
 
            reject(Error(errMessage));
 
        }
    });

Promise 实例拥有 then 方法(具备 then 方法的对象,一般被称为 thenable)。它的使用方法以下:

promise.then(onFulfilled, onRejected)

接收两个函数做为参数,一个在 fulfilled 的时候被调用,一个在 rejected 的时候被调用,接收参数就是 future,onFulfilled对应 resolveonRejected 对应 reject

5八、说说严格模式的限制

变量必须声明后再使用
 
函数的参数不能有同名属性,不然报错
 
不能使用with语句
 
不能对只读属性赋值,不然报错
 
不能使用前缀0表示八进制数,不然报错
 
不能删除不可删除的属性,不然报错
 
不能删除变量delete prop,会报错,只能删除属性delete global[prop]
 
eval不会在它的外层做用域引入变量
 
eval和arguments不能被从新赋值
 
arguments不会自动反映函数参数的变化
 
不能使用arguments.callee
 
不能使用arguments.caller
 
禁止this指向全局对象
 
不能使用fn.caller和fn.arguments获取函数调用的堆栈
 
增长了保留字(好比protected、static和interface)

设立”严格模式”的目的,主要有如下几个:

  • 消除Javascript语法的一些不合理、不严谨之处,减小一些怪异行为;

  • 消除代码运行的一些不安全之处,保证代码运行的安全;

  • 提升编译器效率,增长运行速度;

  • 为将来新版本的Javascript作好铺垫。

注:通过测试IE6,7,8,9均不支持严格模式。

5九、说说你对AMD和Commonjs的理解

CommonJS是服务器端模块的规范,Node.js采用了这个规范。CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操做。AMD规范则是非同步加载模块,容许指定回调函数。

AMD推荐的风格经过返回一个对象作为模块对象,CommonJS的风格经过对module.exportsexports的属性赋值来达到暴露模块对象的目的。

60、document.write()的用法

document.write()方法能够用在两个方面:页面载入过程当中用实时脚本建立页面内容,以及用延时脚本建立本窗口或新窗口的内容。

document.write只能重绘整个页面。innerHTML能够重绘页面的一部分

6一、说说你对MVC和MVVM的理解

MVC

6二、attribute和property的区别是什么?

attributedom元素在文档中做为html标签拥有的属性;

property就是dom元素在js中做为对象拥有的属性。

因此:

对于html的标准属性来讲,attributeproperty是同步的,是会自动更新的,

可是对于自定义的属性来讲,他们是不一样步的,

6三、说说网络分层里七层模型是哪七层

物理层:经过媒介传输比特,肯定机械及电气规范(比特Bit)
数据链路层:将比特组装成帧和点到点的传递(帧Frame)
网络层:负责数据包从源到宿的传递和网际互连(包PackeT)
传输层:提供端到端的可靠报文传递和错误恢复(段Segment)
会话层:创建、管理和终止会话(会话协议数据单元SPDU)
表示层:对数据进行翻译、加密和压缩(表示协议数据单元PPDU)
应用层:容许访问OSI环境的手段(应用协议数据单元APDU)

6四、什么样的前端代码是好的?

高复用低耦合,这样文件小,好维护,并且好扩展。

6五、let,const,var 区别?

 var:函数做用域,存在变量提高 
let:块做用域,不存在变量提高 
const:不能修改的是栈内存在的值和地址。声明一个基本类型的时候为常量,不可修改;声明对象能够修改

6六、比较typeof与instanceof?

相同点:JavaScript 中 typeof 和 instanceof 经常使用来判断一个变量是否为空,或者是什么类型的。

typeof的定义和用法:返回值是一个字符串,用来讲明变量的数据类型。

细节:

(1)、typeof 通常只能返回以下几个结果:number,boolean,string,function,object,undefined。

(2)、typeof 来获取一个变量是否存在,如 if(typeof a!="undefined"){alert("ok")},而不要去使用 if(a) 由于若是 a 不存在(未声明)则会出错。

(3)、对于 Array,Null 等特殊对象使用 typeof 一概返回 object,这正是 typeof 的局限性。

Instanceof定义和用法:instanceof 用于判断一个变量是否属于某个对象的实例。

实例演示:

a instanceof b?alert("true"):alert("false"); //a是b的实例?真:假
var a = new Array(); 
alert(a instanceof Array);  // true
alert(a instanceof Object)  // true
//如上,会返回 true,同时 alert(a instanceof Object) 也会返回 true;这是由于 Array 是 object 的子类。
function test(){};
var a = new test();
alert(a instanceof test)   // true

细节:

(1)、以下,获得的结果为‘N’,这里的 instanceof 测试的 object 是指 js 语法中的 object,不是指 dom 模型对象。

if (window instanceof Object){ alert('Y')} else {  alert('N');}  // 'N'

6七、简述一下src与href的区别

href 是指向网络资源所在位置,创建和当前元素(锚点)或当前文档(连接)之间的连接,用于超连接。

src是指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置;在请求src资源时会将其指向的资源下载并应用到文档内,例如js脚本,img图片和frame等元素。

当浏览器解析到该元素时,会暂停其余资源的下载和处理,直到将该资源加载、编译、执行完毕,图片和框架等元素也如此,相似于将所指向资源嵌入当前标签内。这也是为何将js脚本放在底部而不是头部。

6八、简述同步和异步的区别

同步是阻塞模式,异步是非阻塞模式。
同步就是指一个进程在执行某个请求的时候,若该请求须要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;
异步是指进程不须要一直等下去,而是继续执行下面的操做,无论其余进程的状态。当有消息返回时系统会通知进程进行处理,这样能够提升执行的效率。

6九、px和em的区别

相同点:px和em都是长度单位;

异同点:px的值是固定的,指定是多少就是多少,计算比较容易。em得值不是固定的,而且em会继承父级元素的字体大小。
浏览器的默认字体高都是16px。因此未经调整的浏览器都符合: 1em=16px。那么12px=0.75em, 10px=0.625em。

70、如何规避javascript多人开发函数重名问题

  • 命名空间
  • 封闭空间
  • js模块化mvc(数据层、表现层、控制层)
  • seajs
  • 变量转换成对象的属性
  • 对象化

7一、前端开发中,如何优化图像?图像格式的区别?

优化图像:

一、不用图片,尽可能用css3代替。 好比说要实现修饰效果,如半透明、边框、圆角、阴影、渐变等,在当前主流浏览器中均可以用CSS达成。

二、 使用矢量图SVG替代位图。对于绝大多数图案、图标等,矢量图更小,且可缩放而无需生成多套图。如今主流浏览器都支持SVG了,因此可放心使用!

3.、使用恰当的图片格式。咱们常见的图片格式有JPEG、GIF、PNG。

基本上,内容图片多为照片之类的,适用于JPEG。

而修饰图片一般更适合用无损压缩的PNG。

GIF基本上除了GIF动画外不要使用。且动画的话,也更建议用video元素和视频格式,或用SVG动画取代。

四、按照HTTP协议设置合理的缓存。

五、使用字体图标webfont、CSS Sprites等。

六、用CSS或JavaScript实现预加载。

七、WebP图片格式能给前端带来的优化。WebP支持无损、有损压缩,动态、静态图片,压缩比率优于GIF、JPEG、JPEG2000、PG等格式,很是适合用于网络等图片传输。

 图像格式的区别:

矢量图:图标字体,如 font-awesome;svg 

位图:gif,jpg(jpeg),png

区别:

  一、gif:是是一种无损,8位图片格式。具备支持动画,索引透明,压缩等特性。适用于作色彩简单(色调少)的图片,如logo,各类小图标icons等。

  二、JPEG格式是一种大小与质量相平衡的压缩图片格式。适用于容许轻微失真的色彩丰富的照片,不适合作色彩简单(色调少)的图片,如logo,各类小图标icons等。

  三、png:PNG能够细分为三种格式:PNG8,PNG24,PNG32。后面的数字表明这种PNG格式最多能够索引和存储的颜色值。

关于透明:PNG8支持索引透明和alpha透明;PNG24不支持透明;而PNG32在24位的PNG基础上增长了8位(256阶)的alpha通道透明;

优缺点:

  一、能在保证最不失真的状况下尽量压缩图像文件的大小。

  二、对于须要高保真的较复杂的图像,PNG虽然能无损压缩,但图片文件较大,不适合应用在Web页面上。

7二、浏览器是如何渲染页面的?

渲染的流程以下:

1.解析HTML文件,建立DOM树。

   自上而下,遇到任何样式(link、style)与脚本(script)都会阻塞(外部样式不阻塞后续外部脚本的加载)。

2.解析CSS。优先级:浏览器默认设置<用户设置<外部样式<内联样式<HTML中的style样式;

3.将CSS与DOM合并,构建渲染树(Render Tree)

4.布局和绘制,重绘(repaint)和重排(reflow)

7三、解释“JavaScript模块模式”以及你在什么时候使用它。你是如何组织本身的代码?是使用模块模式,仍是使用经典继承的方法?

若是有提到无污染的命名空间,能够考虑加分。

若是你的模块没有本身的命名空间会怎么样? 
请看文章-JavaScript之模块化编程 和JavaScript之命名空间模式 浅析

请看文章-JavaScript之模块化编程和Javascript之对象的继承

7四、说说你对语义化的理解?

1.去掉或样式丢失的时候能让页面呈现清晰的结构:html自己是没有表现的,咱们看到例如<h1>是粗体,字体大小2em,加粗;<strong>是加粗的,不要认为这是html的表现,这些其实html默认的css样式在起做用,因此去掉或样式丢失的时候能让页面呈现清晰的结构不是语义化的HTML结构的优势,可是浏览器都有有默认样式,默认样式的目的也是为了更好的表达html的语义,能够说浏览器的默认样式和语义化的HTML结构是不可分割的。

2.屏幕阅读器(若是访客有视障)会彻底根据你的标记来“读”你的网页。

3.PDA、手机等设备可能没法像普通电脑的浏览器同样来渲染网页(一般是由于这些设备对CSS的支持较弱)。

4.有利于SEO:和搜索引擎创建良好沟通,有助于爬虫抓取更多的有效信息:爬虫依赖于标签来肯定上下文和各个关键字的权重。

5.便于团队开发和维护,语义化更具可读性,是下一步吧网页的重要动向,遵循W3C标准的团队都遵循这个标准,能够减小差别化。

7五、为何利用多个域名来提供网站资源会更有效?

1.CDN缓存更方便

2.突破浏览器并发限制(通常每一个域名创建的连接不超过6个)

3.Cookieless,节省带宽,尤为是上行带宽通常比下行要慢

4.对于UGC的内容和主站隔离,防止没必要要的安全问题(上传js窃取主站cookie之类的)。正是这个缘由要求用户内容的域名必须不是本身主站的子域名,而是一个彻底独立的第三方域名。

5.数据作了划分,甚至切到了不一样的物理集群,经过子域名来分流比较省事。这个可能被用的很少。 
PS:关于Cookie的问题,带宽是次要的,安全隔离才是主要的。关于多域名,也不是越多越好,虽然服务器端能够作泛解释,浏览器作dns解释也是耗时间的,并且太多域名,若是要走https的话,还有要多买证书和部署的问题。

7六、若是你参与到一个项目中,发现他们使用Tab来缩进代码,可是你喜欢空格,你会怎么作?

建议这个项目使用像EditorConfig(http://editorconfig.org/)之类的规范 
为了保持一致性,接受项目原有的风格 
直接使用VIM的retab命令

7七、你都使用哪些工具来测试代码的性能?

Profiler,JSPerf(http://jsperf.com/nexttick-vs-setzerotimeout-vs-settimeout),Dromaeo。

7八、请谈一下你对网页标准和标准制定机构重要性的理解。

w3c存在的意义就是让浏览器兼容性问题尽可能小,首先是他们对浏览器开发者的约束,而后是对开发者的约束。

7九、什么是FOUC(无样式内容闪烁)?你如何来避免FOUC?

FOUC(Flash Of Unstyled Content)–文档样式闪烁

而引用CSS文件的@import就是形成这个问题的罪魁祸首。IE会先加载整个HTML文档的DOM,而后再去导入外部的CSS文件,所以,在页面DOM加载完成到CSS导入完成中间会有一段时间页面上的内容是没有样式的,这段时间的长短跟网速,电脑速度都有关系。解决方法简单的出奇,只要在之间加入一个或者<script>元素就能够了。

80、若是网页内容须要支持多语言,你会怎么作?

下面这些问题须要考虑:

  • 应用字符集的选择,选择UTF-8编码

  • 语言书写习惯&导航结构

  • 数据库驱动型网站

8一、data-属性的做用是什么?

data-* 属性用于存储页面或应用程序的私有自定义数据。data-* 属性赋予咱们在全部 HTML 元素上嵌入自定义 data 属性的能力。存储的(自定义)数据可以被页面的 JavaScript 中利用,以建立更好的用户体验(不进行 Ajax 调用或服务器端数据库查询)。

data-* 属性包括两部分:

  • 属性名不该该包含任何大写字母,而且在前缀 “data-” 以后必须有至少一个字符

  • 属性值能够是任意字符串

8二、若是把HTML5看做作一个开放平台,那它的构建模块有哪些?

<nav>,<header>,<section>,<footer>等。

8三、请描述一下cookies,sessionStorage和localStorage的区别?

sessionStorage和localStorage是HTML5 Web Storage API提供的,能够方便的在web请求之间保存数据。有了本地数据,就能够避免数据在浏览器和服务器间没必要要地来回传递。sessionStorage、localStorage、cookie都是在浏览器端存储的数据,其中sessionStorage的概念很特别,引入了一个“浏览器窗口”的概念。sessionStorage是在同源的同学口(或tab)中,始终存在的数据。也就是说只要这个浏览器窗口没有关闭,即便刷新页面或进入同源另外一页面,数据仍然存在。关闭窗口后,sessionStorage即被销毁。同时“独立”打开的不一样窗口,即便是同一页面,sessionStorage对象也是不一样的cookies会发送到服务器端。其他两个不会。Microsoft指出InternetExplorer8增长cookie限制为每一个域名50个,但IE7彷佛也容许每一个域名50个cookie。

  • Firefox每一个域名cookie限制为50个。

  • Opera每一个域名cookie限制为30个。

  • Firefox和Safari容许cookie多达4097个字节,包括名(name)、值(value)和等号。

  • Opera容许cookie多达4096个字节,包括:名(name)、值(value)和等号。

  • InternetExplorer容许cookie多达4095个字节,包括:名(name)、值(value)和等号。

84.解释下CSS sprites,以及你要如何在页面或网站中使用它。

CSS Sprites其实就是把网页中一些背景图片整合到一张图片文件中,再利用CSS的“background-image”,“background-repeat”,“background-position”的组合进行背景定位,background-position能够用数字能精确的定位出背景图片的位置。

85.你最喜欢的图片替换方法是什么,你如何选择使用。

<h2><span图片丢这里></span>Hello World</h2>

把span背景设成文字内容,这样又能够保证seo,也有图片的效果在上面。通常都是:alt,title,onerror。

86.讨论CSS hacks,条件引用或者其余。

各个浏览器都认识,这里给firefox用;

\9全部的ie浏览器可识别;

\0是留给ie8的+background-color:pink;+ie7定了;

__专门留给神奇的ie6;:root#test{background-color:purple\9;}:root是给ie9的,

@media all and(min-width:0px){#test{}}这个是总是跟ie抢着认\0的神奇的opera,必须加个\0,否则firefox,chrome,safari也都认识。

@media screen and(-webkit-min-device-pixel-ratio:0){#test{}}最后这个是浏览器新贵chrome和safari的。

87.如何为有功能限制的浏览器提供网页?你会使用哪些技术和处理方法?

88.你用过媒体查询,或针对移动端的布局/CSS吗?

媒体查询,就是响应式布局。经过不一样的媒介类型和条件定义样式表规则。媒介查询让CSS能够更精确做用于不一样的媒介类型和同一媒介的不一样条件。

语法结构及用法:@media 设备名 only (选取条件) not (选取条件) and(设备选取条件),设备二{sRules}。

示例以下:

/* 当浏览器的可视区域小于980px */

 @media screen and (max-width: 980px) {

 #wrap {width: 90%; margin:0 auto;}

 #content {width: 60%;padding: 5%;}

 #sidebar {width: 30%;}

 #footer {padding: 8% 5%;margin-bottom: 10px;}

 }

 /* 当浏览器的可视区域小于650px */

 @media screen and (max-width: 650px) {

#header {height: auto;}

#searchform {position: absolute;top: 5px;right: 0;}

#content {width: auto; float: none; margin: 20px 0;}

#sidebar {width: 100%; float: none; margin: 0;}

}

89.请罗列出你所知道的display属性的所有值。

CSS display 属性

90.如何优化网页的打印样式?

<link rel = "stylesheet" type = "text/css" media = "screen" href = "xxx.css"/>

其中media指定的属性就是设备,显示器上就是screen,打印机则是print,电视是tv,投影仪是projection。打印样式示例以下:

<link rel = "stylesheet" type = "text/css" media = "print" href = "yyy.css"/>

但打印样式表也应注意如下事项:

打印样式表中最好不要用背景图片,由于打印机不能打印CSS中的背景。如要显示图片,请使用html插入到页面中。

最好不要使用像素做为单位,由于打印样式表要打印出来的会是实物,因此建议使用pt和cm。

隐藏掉没必要要的内容。(@print div{display:none;})

打印样式表中最好少用浮动属性,由于它们会消失。若是想要知道打印样式表的效果如何,直接在浏览器上选择打印预览就能够了。

91.在书写高效CSS时会有哪些问题须要考虑?

  • 1.样式是:从右向左的解析一个选择器;

  • 2.ID最快,Universal最慢有四种类型的key selector,解析速度由快到慢依次是:ID、class、tag和universal ;

  • 3.不要tag-qualify(永远不要这样作ul#main-navigation{}ID已是惟一的,不须要Tag来标识,这样作会让选择器变慢。);

  • 4.后代选择器最糟糕(换句话说,下面这个选择器是很低效的:html body ul li a{});

  • 5.想清楚你为何这样写;

  • 6.CSS3的效率问题(CSS3选择器(好比:nth-child)可以漂亮的定位咱们想要的元素,又能保证咱们的CSS整洁易读。可是这些神奇的选择器会浪费不少的浏览器资源。);

  • 7.咱们知道#ID速度是最快的,那么咱们都用ID,是否是很快。可是咱们不该该为了效率而牺牲可读性和可维护性。

92.若是设计中使用了非标准的字体,你该如何去实现?

所谓的标准字体是多数机器上都会有的,或者即便没有也能够由默认字体替代的字体。

方法:

  • 用图片代替

  • web fonts在线字库,如Google Webfonts,Typekit等等;http://www.chinaz.com/free/2012/0815/269267.shtml;

  • @font-face,Webfonts(字体服务例如:Google Webfonts,Typekit等等。)

93.解释下浏览器是如何判断元素是否匹配某个CSS选择器?

从后往前判断。浏览器先产生一个元素集合,这个集合每每由最后一个部分的索引产生(若是没有索引就是全部元素的集合)。而后向上匹配,若是不符合上一个部分,就把元素从集合中删除,直到真个选择器都匹配完,还在集合中的元素就匹配这个选择器了。举个例子,有选择器:

body.ready#wrapper>.lol233

先把全部class中有lol233的元素拿出来组成一个集合,而后上一层,对每个集合中的元素,若是元素的parent id不为#wrapper则把元素从集合中删去。再向上,从这个元素的父元素开始向上找,没有找到一个tagName为body且class中有ready的元素,就把原来的元素从集合中删去。至此这个选择器匹配结束,全部还在集合中的元素知足。大致就是这样,不过浏览器还会有一些奇怪的优化。为何从后往前匹配由于效率和文档流的解析方向。效率没必要说,找元素的父亲和以前的兄弟比遍历所哟儿子快并且方便。关于文档流的解析方向,是由于如今的CSS,一个元素只要肯定了这个元素在文档流以前出现过的全部元素,就能肯定他的匹配状况。应用在即便html没有载入完成,浏览器也能根据已经载入的这一部分信息彻底肯定出现过的元素的属性。为何是用集合主要也仍是效率。基于CSS Rule数量远远小于元素数量的假设和索引的运用,遍历每一条CSS Rule经过集合筛选,比遍历每个元素再遍历每一条Rule匹配要快得多。

9四、描述一种JavaScript中实现memoization(避免重复运算)的策略

相关文章
相关标签/搜索