• 前端面试总结


    1、http和https的区别

    http协议通常承载于TCP协议之上,在http和TCP之间添加一个安全协议层(SSLTSL),这个时候,就成了我们常说的https。

    默认的http端口为80,https的端口为443

    2、为什么https安全?

    因为网络请求需要中间有很多的服务器路由器的转发,中间的节点都可能篡改信息,如果使用了https,密钥在你和终点站才有,http之所以比http安全,是因为他利用ssl/tls协议传输。

    3、javascript垃圾回收方法

    标记清除(mark and sweep)

    这是javascript最常见的垃圾回收方式,当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将其标记为“进入环境”,当变量离开环境时候(函数执行结束)将其标记为“离开环境”。

    饮用计数(reference counting)

    在低版本ie经常会出现内存泄露,很多时候就是因为其采用引用计数方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数,当声明了一个变量并将一个引用类型赋值给该变量的时候这个值的引用计数就加1,如果该变量的值变成了另外一个,则这个值的引用次数就减1,当这个值的引用次数变为0的时候,说明没有在使用,这个值没法被访问了,因此可以将其占用空间回收。

    4、性能优化的问题

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

    缓存利用:缓存ajax,使用CDN,使用外部js和css文件以便缓存,添加expires头,服务器端配置etag,减少DNS查找等

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

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

    移动端性能优化

    1、尽量使用css3动画,开启硬件加速

    2、使用使用touch事件代替click事件

    3、避免使用css3渐变阴影效果

    4、可以用transform:translateZ(0)来开启硬件加速

    5、不滥用float,float在渲染时计算量比较大,尽量减少使用

    6、不滥用web字体,web字体需要下载,解析,重绘当前页面,尽量减少使用

    5、什么是etag?

    当发送一个服务器请求的时候,浏览器首先会进行缓存过期判断,浏览器根据缓存过期时间判断缓存文件是否过期。

    情景一:若没有过期,则不向服务器发送请求,直接使用缓存中的结果,此时我们在浏览器控制台中可以看到200 OK (from cache),

    此时的情况就是完全使用缓存,浏览器和服务器没有任何交互。

    情景二:若过期,则向服务器发送请求,此时请求会带上1中设置的文件修改时间和etag

    然后进行资源更新判断,服务器根据浏览器传过来的文件修改时间,判断自浏览器上一次请求之后,文件是不是没有修改过,根据etag,判断文件内容自上一次请求之后,有没有发生变化

    情形一:若两种判断的结论都是文件没有被修改过,则服务器就不给浏览器发index.html的内容了,直接告诉它,文件没有被修改过,你用你那边的缓存吧—— 304 Not Modified,此时浏览器就会从本地缓存中获取index.html的内容。此时的情况叫协议缓存,浏览器和服务器之间有一次请求交互。

    情形二:若修改时间和文件内容判断有任意一个没有通过,则服务器会受理此次请求,之后的操作同①

    只有get请求会被缓存,post请求不会

    Expires和Cache-Control

    Expires要求客户端和服务端的时钟严格同步。HTTP1.1引入Cache-Control来克服Expires头的限制。如果max-age和Expires同时出现,则max-age有更高的优先级。

    Cache-Control: no-cache, private, max-age=0

    ETag: abcde Expires: Thu, 15 Apr 2014 20:00:00 GMT

    Pragma: private

    Last-Modified: $now // RFC1123 format

     ETag应用:

     Etag由服务器端生成,客户端通过If-Match或者说If-None-Match这个条件判断请求来验证资源是否修改。常见的是使用If-None-Match。请求一个文件的流程可能如下:

    ====第一次请求===

    1.客户端发起 HTTP GET 请求一个文件;
    
    2.服务器处理请求,返回文件内容和一堆Header,当然包括Etag(例如"2e681a-6-5d044840")(假设服务器支持Etag生成和已经开启了Etag).状态码200
    

    ====第二次请求===

    客户端发起 HTTP GET 请求一个文件,注意这个时候客户端同时发送一个If-None-Match头,这个头的内容就是第一次请求时服务器返回的Etag:2e681a-6-5d0448402.服务器判断发送过来的Etag和计算出来的Etag匹配,因此If-None-Match为False,不返回200,返回304,客户端继续使用本地缓存;流程很简单,问题是,如果服务器又设置了Cache-Control:max-age和Expires呢,怎么办
    

    答案是同时使用,也就是说在完全匹配If-Modified-SinceIf-None-Match即检查完修改时间和Etag之后,

    服务器才能返回304.(不要陷入到底使用谁的问题怪圈)

    6、为什么使用Etag请求头?

    Etag 主要为了解决 Last-Modified 无法解决的一些问题

    7、栈和队列的区别?

    栈的插入和删除操作都是在一端进行的,而队列的操作却是在两端进行的。
    
    队列先进先出,栈先进后出。
    
    栈只允许在表尾一端进行插入和删除,而队列只允许在表尾一端进行插入,在表头一端进行删除
    

    8、栈和堆的区别?

    栈区(stack)—   由编译器自动分配释放,存放函数的参数值,局部变量的值等。
    
    堆区(heap)   —   一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。
    
    堆(数据结构):堆可以被看成是一棵树,如:堆排序;
    
    栈(数据结构):一种先进后出的数据结构。

    9、快速 排序的思想并实现一个快排?

    “快速排序”的思想很简单,整个排序过程只需要三步:

      (1)在数据集之中,找一个基准点

      (2)建立两个数组,分别存储左边和右边的数组

      (3)利用递归进行下次比较

        <script type="text/javascript">
    
            function quickSort(arr){
                if(arr.length<=1){
                    return arr;//如果数组只有一个数,就直接返回;
                }
    
                var num = Math.floor(arr.length/2);//找到中间数的索引值,如果是浮点数,则向下取整
    
                var numValue = arr.splice(num,1);//找到中间数的值
                var left = [];
                var right = [];
    
                for(var i=0;i<arr.length;i++){
                    if(arr[i]<numValue){
                        left.push(arr[i]);//基准点的左边的数传到左边数组
                    }
                    else{
                       right.push(arr[i]);//基准点的右边的数传到右边数组
                    }
                }
    
                return quickSort(left).concat([numValue],quickSort(right));//递归不断重复比较
            }
    
            alert(quickSort([32,45,37,16,2,87]));//弹出“2,16,32,37,45,87”
    
        </script>

    10、关于Http 2.0 你知道多少?

    HTTP/2引入了“服务端推(server push)”的概念,它允许服务端在客户端需要数据之前就主动地将数据发送到客户端缓存中,从而提高性能。

    HTTP/2提供更多的加密支持

    HTTP/2使用多路技术,允许多个消息在一个连接上同时交差。

    它增加了头压缩(header compression),因此即使非常小的请求,其请求和响应的header都只会占用很小比例的带宽。

    11、谈谈浮动和清除浮动

    浮动的框可以向左或向右移动,直到他的外边缘碰到包含框或另一个浮动框的边框为止。由于浮动框不在文档的普通流中,所以文档的普通流的块框表现得就像浮动框不存在一样。浮动的块框会漂浮在文档普通流的块框上

    12、说说你对闭包的理解

    使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。在js中,函数即闭包,只有函数才会产生作用域的概念

    闭包有三个特性:

    1.函数嵌套函数

    2.函数内部可以引用外部的参数和变量

    3.参数和变量不会被垃圾回收机制回收

    13、请你谈谈Cookie的弊端

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

    第一:每个特定的域名下最多生成20个cookie

    1.IE6或更低版本最多20个cookie
    
    2.IE7和之后的版本最后可以有50个cookie。
    
    3.Firefox最多50个cookie
    
    4.chrome和Safari没有做硬性限制
    

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

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

    IE 提供了一种存储可以持久化用户数据,叫做userdata,从IE5.0就开始支持。每个数据最多128K,每个域名下最多1M。这个持久化数据放在缓存中,如果缓存没有清理,那么会一直存在。

    优点:极高的扩展性和可用性

    1.通过良好的编程,控制保存在cookie中的session对象的大小。
    
    2.通过加密和安全传输技术(SSL),减少cookie被破解的可能性。
    
    3.只在cookie中存放不敏感数据,即使被盗也不会有重大损失。
    
    4.控制cookie的生命期,使之不会永远有效。偷盗者很可能拿到一个过期的cookie。
    

    缺点:

    1.`Cookie`数量和长度的限制。每个domain最多只能有20条cookie,每个cookie长度不能超过4KB,否则会被截掉.
    
    
    2.安全性问题。如果cookie被人拦截了,那人就可以取得所有的session信息。即使加密也与事无补,因为拦截者并不需要知道cookie的意义,他只要原样转发cookie就可以达到目的了。
    
    3.有些状态不可能保存在客户端。例如,为了防止重复提交表单,我们需要在服务器端保存一个计数器。如果我们把这个计数器保存在客户端,那么它起不到任何作用。

    14、浏览器本地存储

    在较高版本的浏览器中,js提供了sessionStorageglobalStorage。在HTML5中提供了localStorage来取代globalStorage

    html5中的Web Storage包括了两种存储方式:sessionStoragelocalStorage

    sessionStorage用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁。因此sessionStorage不是一种持久化的本地存储,仅仅是会话级别的存储。

    localStorage用于持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的。

    web storage和cookie的区别

    Web Storage的概念和cookie相似,区别是它是为了更大容量存储设计的。Cookie的大小是受限的,并且每次你请求一个新的页面的时候Cookie都会被发送过去,这样无形中浪费了带宽,另外cookie还需要指定作用域,不可以跨域调用。

    除此之外,Web Storage拥有setItem,getItem,removeItem,clear等方法,不像cookie需要前端开发者自己封装setCookie,getCookie

    但是cookie也是不可以或缺的:cookie的作用是与服务器进行交互,作为HTTP规范的一部分而存在 ,而Web Storage仅仅是为了在本地“存储”数据而生

    浏览器的支持除了IE7及以下不支持外,其他标准浏览器都完全支持(ie及FF需在web服务器里运行),值得一提的是IE总是办好事,例如IE7、IE6中的userData其实就是javascript本地存储的解决方案。通过简单的代码封装可以统一到所有的浏览器都支持web storage

    localStoragesessionStorage都具有相同的操作方法,例如setItem、getItemremoveItem

     1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
    
     2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
    
        考虑到安全应当使用session。
    
     3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
    
         考虑到减轻服务器性能方面,应当使用COOKIE。
    
     4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
    
     5、所以个人建议:
    
        将登陆信息等重要信息存放为SESSION
    
        其他信息如果需要保留,可以放在COOKIE中

    15、CSS中link 和@import的区别是?

    (1) link属于HTML标签,而@import是CSS提供的;
    
    (2) 页面被加载的时,link会同时被加载,而@import被引用的CSS会等到引用它的CSS文件被加载完再加载;
    
    (3) import只在IE5以上才能识别,而link是HTML标签,无兼容问题;
    
    (4) link方式的样式的权重 高于@import的权重.

    16、position:absolutefloat属性的异同

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

    • 不同点:float仍会占据位置,absolute会覆盖文档流中的其他元素。

    17、介绍一下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规范对盒模型解析,一旦修改了元素的边框或内距,就会影响元素的盒子尺寸,就不得不重新计算元素的盒子尺寸,从而影响整个页面的布局。

    18、CSS3新增伪类举例

    p:first-of-type 选择属于其父元素的首个 <p> 元素的每个 <p> 元素。

    p:last-of-type 选择属于其父元素的最后 <p> 元素的每个 <p> 元素。

    p:only-of-type 选择属于其父元素唯一的 <p> 元素的每个 <p> 元素。

    p:only-child 选择属于其父元素的唯一子元素的每个 <p> 元素。

    p:nth-child(2) 选择属于其父元素的第二个子元素的每个 <p> 元素。

    :enabled :disabled 控制表单控件的禁用状态。

    :checked 单选框或复选框被选中。

    19、说说你对语义化的理解?

    1,去掉或者丢失样式的时候能够让页面呈现出清晰的结构
    
    2,有利于SEO:和搜索引擎建立良好沟通,有助于爬虫抓取更多的有效信息:爬虫依赖于标签来确定上下文和各个关键字的权重;
    
    3,方便其他设备解析(如屏幕阅读器、盲人阅读器、移动设备)以意义的方式来渲染网页;
    
    4,便于团队开发和维护,语义化更具可读性,是下一步吧网页的重要动向,遵循W3C标准的团队都遵循这个标准,可以减少差异化。

    20、浮动元素引起的问题和解决办法?

    浮动元素引起的问题:
    
    (1)父元素的高度无法被撑开,影响与父元素同级的元素
    
    (2)与浮动元素同级的非浮动元素(内联元素)会跟随其后
    
    (3)若非第一个元素浮动,则该元素之前的元素也需要浮动,否则会影响页面显示的结构

    清除浮动的几种方法:

        1,额外标签法,<div style="clear:both;"></div>(缺点:不过这个办法会增加额外的标签使HTML结构看起来不够简洁。)
    
        2,使用after伪类
    
        #parent:after{
    
            content:".";
    
            height:0;
    
            visibility:hidden;
    
            display:block;
    
            clear:both;
    
            }
    
    
        3,浮动外部元素
    
        4,设置overflow为hidden或者auto

    21、DOM操作——怎样添加、移除、移动、复制、创建和查找节点。

    1)创建新节点

          createDocumentFragment()    //创建一个DOM片段
    
          createElement()   //创建一个具体的元素
    
          createTextNode()   //创建一个文本节点
    

    2)添加、移除、替换、插入

          appendChild()
    
          removeChild()
    
          replaceChild()
    
          insertBefore() //并没有insertAfter()
    

    3)查找

          getElementsByTagName()    //通过标签名称
    
          getElementsByName()    //通过元素的Name属性的值(IE容错能力较强,
          会得到一个数组,其中包括id等于name值的)
    
          getElementById()    //通过元素Id,唯一性
    

    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;

    22、null和undefined的区别?

    null是一个表示”无”的对象,转为数值时为0;undefined是一个表示”无”的原始值,转为数值时为NaN

    当声明的变量还未被初始化时,变量的默认值为undefined

    null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。

    undefined表示”缺少值”,就是此处应该有一个值,但是还没有定义。典型用法是:

    (1)变量被声明了,但没有赋值时,就等于undefined。
    
    
    (2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。
    
    
    (3)对象没有赋值的属性,该属性的值为undefined。
    
    
    (4)函数没有返回值时,默认返回undefined。
    

    null表示”没有对象”,即该处不应该有值。典型用法是:

    (1) 作为函数的参数,表示该函数的参数不是对象。
    
    (2) 作为对象原型链的终点

    23、哪些操作会造成内存泄漏?

    内存泄漏指任何对象在您不再拥有或需要它之后仍然存在。
    
    垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为 0(没有其他对象引用过该对象),或对该对象的惟一引用是循环的,那么该对象的内存即可回收。
    
    
    
    setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏。
    
    闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)

    24、列举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以下不支持圆角

    25、对前端界面工程师这个职位是怎么样理解的?它的前景会怎么样?

    前端是最贴近用户的程序员,比后端、数据库、产品经理、运营、安全都近。
    
        1、实现界面交互
    
        2、提升用户体验
    
        3、有了Node.js,前端可以实现服务端的一些事情
    
    
    前端是最贴近用户的程序员,前端的能力就是能让产品从 90分进化到 100 分,甚至更好,
    
    
    
     参与项目,快速高质量完成实现效果图,精确到1px;
    
     与团队成员,UI设计,产品经理的沟通;
    
     做好的页面结构,页面重构和用户体验;
    
     处理hack,兼容、写出优美的代码格式;
    
     针对服务器的优化、拥抱最新前端技术

    26、一个页面从输入 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`
    

    详情:[从输入 URL 到浏览器接收的过程中发生了什么事情?][8]

    27、请解释一下 JavaScript 的同源策略。

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

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

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

    为什么要有同源限制?

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

    28、GET和POST的区别,何时使用POST?

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

    28、HTTP状态码

    
        100  Continue  继续,一般在发送post请求时,已发送了http header之后服务端将返回此信息,表示确认,之后发送具体参数信息
    
        200  OK   正常返回信息
    
        201  Created  请求成功并且服务器创建了新的资源
    
        202  Accepted  服务器已接受请求,但尚未处理
    
        301  Moved Permanently  请求的网页已永久移动到新位置。
    
        302 Found  临时性重定向。
    
        303 See Other  临时性重定向,且总是使用 GET 请求新的 URI。
    
        304  Not Modified  自从上次请求后,请求的网页未修改过。
    
    
        400 Bad Request  服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求。
    
        401 Unauthorized  请求未授权。
    
        403 Forbidden  禁止访问。
    
        404 Not Found  找不到如何与 URI 相匹配的资源。
    
        500 Internal Server Error  最常见的服务器端错误。
    
        503 Service Unavailable 服务器端暂时无法处理请求(可能是过载或维护)。
     
  • 相关阅读:
    1150 Travelling Salesman Problem(25 分)
    poj 2408 Anagram Groups
    guava学习--ratelimiter
    guava学习--Objects
    guava学习--ComparisonChain
    guava学习--Preconditions
    guava学习--Function、Predicate
    guava学习--FutureFallback
    guava学习--FutureCallback
    guava学习--SettableFuture
  • 原文地址:https://www.cnblogs.com/liangshuang/p/8467728.html
Copyright © 2020-2023  润新知