web前端開發面試遇到的題目

每次面試的題目都總結在一個小本本上,很不方便,有小夥伴推薦寫博客,我就來總結一下近期遇到的面試題目。javascript

一、解釋html語義化?css

回答:用正確的標籤作正確的事情。html語義化讓頁面的內容結構化、結構更清晰、便於對瀏覽器、搜索引擎解析;html

   即便在沒有css樣式的狀況下,也以一種文檔格式顯示,而且是容易閱讀的;前端

   搜索引擎的爬蟲也依賴於html標記來肯定上下文和各個關鍵字的權重,利於SEO;html5

      使閱讀代碼的人對網站更容易對網站分塊,便於閱讀維護理解。java

二、塊級元素與行內元素的區別?各自有哪些?nginx

回答:css規範規定,每一個元素都有一個display屬性,肯定該元素的類型,如div的display默認值爲「block」,則爲「塊級」元素;span默認display屬性值爲「inline」,是「行內」元素。web

    區別:第一:塊級元素會獨佔一行,其寬度自動填充父元素寬度;行內元素不會獨佔一行,相鄰的行內元素會排列在一行裏,直到一行拍不下,纔會換行。面試

      第二:塊級元素能夠設置width、height,行內元素設置無效。(塊級元素即便設置了width寬度,也是獨佔一行)。ajax

      第三:塊級元素能夠設置margin、padding,行內元素水平方向有效,豎直方向無效。(例如:margin-left,margin-right、padding-left、padding-right有效)。

       塊級元素:div、ul、li、ol、dl、dt、dd、h一、h二、h三、h4...p、table form fieldset dir-目錄列表 menu 

    行內元素:a b span img strong select label sub sup textarea input

    空元素:br hr img input link meta

三、DOCTYPE的做用?標準模式和兼容模式各有什麼區別?爲何html5只須要寫<!doctype html>?

回答:(1)、<!doctype>聲明位於html文檔中的第一行,處於<html>標籤以前。告知瀏覽器的解析器用什麼文檔標準解析這個文檔。DOCTYPE不存在或者格式不正確會致使文檔以兼容模式呈現。

   (2)、標準模式的排版和js運做模式都是以該瀏覽器支持的最高標準運行;在兼容模式下,頁面以寬鬆的向後兼容的方式顯示,模擬老式瀏覽器的行爲以防止站點沒法工做。

     (3)、HTML不基於SGML,所以不須要對DTD進行引用,可是須要doctype來規範瀏覽器的行爲(讓瀏覽器按照他們應該的方式來運行);

      而html4.01基於SGML,因此須要對DTD進行引用,才能告知瀏覽器文檔所使用的文檔類型。

四、link和@import的區別?

回答:(1)、link屬於xhtml標籤,除了加載css以外,還能用於定義rss,定義rel鏈接屬性等做用;而@import是css提供的,只能用於加載css;

   (2)、頁面被加載時,link會同時被加載;而@import引用的css會等到頁面被加載完後再加載。    

   (3)、@import是css2.1提出的,只有在IE5以上才能被識別,而link是xhtml標籤,無兼容問題。

五、HTML5有哪些新特性?移除了哪些元素?如何處理html5新標籤的瀏覽器兼容問題?如何區分html和html5?

回答:(1)、h5不是SGML的子集,主要是關於圖像、位置、存儲、多任務等功能的增長。

       繪畫canvas;用於媒介回放的video和audio元素;語義化更好的內容元素:article、footer、header、nav、section;本地離線存儲localStorage長期存儲數據,瀏覽器關閉後數據不丟失;sessionStorage的數據在瀏覽器關閉後自動刪除;表單控件增添calendar、date、time、email、url、search;新的技術Webworker,Websocket,Geolocation。

   (2)、移除的元素:純表現的元素:basefont\big\center\font\s\u;對可用性產生負面影響的元素:frame\frameset\noframes;

   (3)、處理和html5新標籤的瀏覽器兼容問題:

      當在頁面中使用html5新標籤時,可能獲得三種不一樣的狀況:

        1>結果1:新標籤被當作錯誤處理而且忽略,在DOM構建時會看成這個標籤不存在;

        2>結果2:新標籤看成錯誤處理,並在DOM構建時,這個新標籤會被構形成行內元素;

        3>結果3:新標籤被識別爲html5標籤,而後用DOM節點對其進行替換。

      不能識別html5標籤而不能使用,解決辦法以下:

        1>方法1:實現標籤被識別

         經過document.creatElement(tagname)方法讓瀏覽器識別新標籤,瀏覽器支持標籤後,還能夠爲新標籤增添css樣式。

        2>方法2:javascript解決方案

          a)使用html5shim:

          在head中調用一下代碼:(也能夠下載到本身的網站上進行調用,可是必須在head中)

                 <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>  

         b)使用kill IE6

          在</body>以前調用如下代碼:      

              <script src="http://letskillie6.googlecode.com/svn/trunk/letskillie6.zh_CN.pack.js"></script>         

    (4)、區分html和html5:doctype聲明、新增的結構元素|功能元素。

六、css選擇符?優先級算法?哪些屬性能夠繼承?

回答:(1)、id選擇器;(2)、類選擇器;(3)、標籤選擇器;(4)、相鄰選擇器(h1+p);(5)、子選擇器(ul>li);(6)、後代選擇器(li a);(7)、通配符選擇器(*);(8)、屬性選擇器(a[rel="external"]);(9)、僞類選擇器(a:hover);

    可繼承的屬性:font-size/font-family/color/UL LI Dl DD DT;

    不可繼承的樣式:border/margin/padding/height/width/display/position/float/left...;

    優先級:!important>id>class>tag>*;  !important比內聯優先級高;內聯樣式表(標籤內部)>嵌入樣式表(當前文件中)>外部樣式表(外部文件中)

七、描述cookies,sessionStorage,localStorage的區別?

回答:(1)、cookie是網站用於標識用戶的身份而儲存在用戶本地終端(client side)上的數據(一般通過加密);cookie數據始終在同源的http中攜帶(即便不須要),即會在瀏覽器和服務器間來回傳遞;(2)、sessionStorage和localStorage不會自動把數據發給服務器,僅在本地保存。

   (3)、存儲大小:cookie數據大小不能超過4k;sessionStorage和localStorage雖然也有存儲大小的限制,但比cookie大得多,能夠達到5M或更大。

   (4)、有效時間:localStorage存儲持久數據,瀏覽器關閉後數據不丟失除非主動刪除數據;

           sessionStorage數據在當前瀏覽器關閉後刪除;

           cookie 設置的cookie過時時間以前一直有效,即便窗口或者瀏覽器關閉。

八、javascript有幾種數據類型?劃一下他們的內存圖?

回答: 棧:原始數據類型(number、string、Boolean、null、undefined);

    堆:引用數據類型(對象、數組、和函數);

    兩種類型的區別:存儲位置不一樣:原始數據類型存儲在棧中的簡單數據段,佔據空間小,大小固定,屬於被頻繁使用數據,因此放入棧中存儲;

                                     引用數據類型存儲在堆中的對象,佔據空間大,大小不固定。若是存儲在棧中將會影響程序運行的性能;引用數據類型在棧中存儲了指針,該指針指向堆中該實體的起始地址。當解釋器尋找引用值時,會首先檢索其在棧中的地址,取得地址後從堆中得到實體。

九、href和src的區別?

回答:(1)、href表示超文本引用,用於創建當前元素和文檔之間的連接。經常使用的有link、a上使用,當前文檔和引用資源之間確立聯繫,並行下載資源。

      (2)、src是sourse的縮寫,src指向的文檔會嵌入到文檔中當前標籤所在的位置。主要是引入,經常使用與img,script等元素上,替換當前元素,當瀏覽器解析該元素時,會暫停其餘資源的下載和處理,直到完畢。

十、javascript中call()和apply()方法的區別?

回答:ECMAScript規範給全部函數都定義了這兩個方法call()和apply()。

call()方法定義:調用一個對象的一個方法,以另外一個對象替換當前對象。

apply()方法定義:應用某一對象的一個方法,用另外一個對象替換當前對象。

二者的區別在與參數:call()和apply()的第一個參數都是要調用的函數的對象,call()的剩餘參數是傳遞給要調用的函數的值,而apply()只有兩個參數,第一個是對象,第二個是數組,這個數組就是該函數的參數。

十一、javascript原型?原型鏈?以及如何實現繼承?

回答:每一個對象都會在內部初始化一個屬性,就是prototype(原型),當咱們訪問一個對象的屬性時,若是這個對象內部不存在這個屬性,那麼他就會去prototype裏面找這個屬性,這個prototype又會有本身的prototype,因而就這樣一直找下去,就是原型鏈的概念。

如何實現繼承:

1》構造繼承:好比:如今有一個」動物「對象的構造函數

 function Animal(){
    this.species = "動物";
  }

還有一個」貓「對象的構造函數

  function Cat(name,color){
    this.name = name;
    this.color = color;
  }
 

」貓「繼承」動物「

構造函數綁定:使用call()或者apply()方法,將父對象的構造函數綁定在子對象上,即在子對象構造函數中加一行:

 function Cat(name,color){
    Animal.apply(this, arguments);
    this.name = name;
    this.color = color;
  }
  var cat1 = new Cat("大毛","黃色");
  alert(cat1.species); // 動物

2》原型繼承:若是」貓「的prototype對象,指向一個animal的實例,那麼全部貓的實例就能夠繼承animal了。

 Cat.prototype = new Animal();
  Cat.prototype.constructor = Cat;
  var cat1 = new Cat("大毛","黃色");
  alert(cat1.species); // 動物

3》實例繼承:

4》拷貝繼承:

原型prototype機制或apply和call方法去實現比較簡單,建議使用構造方式和原型混合方式。

    function Parent(){
         this.name = 'wang';
     }

     function Child(){
         this.age = 28;
     }
     Child.prototype = new Parent();//繼承了Parent,經過原型

     var demo = new Child();
     alert(demo.age);
     alert(demo.name);//獲得被繼承的屬性

 十二、前端性能優化的方法?

回答:(1)、當須要設置的樣式不少時設置className而不是直接操做style。

   (2)、避免在頁面的主題佈局中使用table,table要等其中的內容徹底下載以後纔會顯示出來,顯示比div+css佈局慢。

   (3)、用innerHTML代替DOM操做,減小DOM操做次數,優化javascript性能。

   (4)、減小http請求次數:CSS Sprites,JS、CSS源碼壓縮,圖片大小控制合適;網頁GZIP壓縮,CDN託管,data緩存,圖片服務器。

   (5)、圖片預加載,將樣式表放在頂部,將腳本放在底部,加上時間戳。

   (6)、前端模板 JS+數據,減小因爲html標籤致使的貸款浪費,前端用變量保存AJAX請求結果,每次操做本地數據,減小請求次數。

   (7)、少用全局變量,緩存DOM節點查找的結果。減小IO(輸入/輸出)讀取操做。

   (8)、避免使用CSS Expression(css 表達式)又稱動態屬性(Dynamic properties)。

   (9)、減小DOM操做;部署前,圖片壓縮、代碼壓縮;優化js代碼結構,減小冗餘代碼;減小http請求,合理設置http緩存;使用內容分發cdn加速;靜態資源緩存;圖片延遲加載;

1三、介紹一下標準的CSS的盒子模型?低版本的IE的盒子模型有什麼不一樣?

回答:(1)、有兩種:IE盒子模型、w3c盒子模型;(2)、盒模型:content(內容)、padding(內邊距)、margin(外邊距)、 border(邊框);(3):區別:IE的content把padding和border計算了進去。

1四、如何居中div?

回答:(1)、水平居中:給DIV設置一個寬度,而後添加margin:0 auto屬性。

 div{
     width:200px;
     margin:0 auto;
  }

(2)、讓絕對定位的div居中:

div {
     position: absolute;
     width: 300px;
     height: 300px;
     margin: auto;
     top: 0;
     left: 0;
     bottom: 0;
     right: 0;
     background-color: pink;    /* 方便看效果 */
 }

(3)、水平垂直居中一:

 肯定容器的寬高 寬500 高 300 的層
 設置層的外邊距

 div {
     position: relative;        /* 相對定位或絕對定位都可 */
     width:500px;
     height:300px;
     top: 50%;
     left: 50%;
     margin: -150px 0 0 -250px;         /* 外邊距爲自身寬高的一半 */
     background-color: pink;         /* 方便看效果 */

  }

(4)、水平垂直居中二:

 未知容器的寬高,利用 `transform` 屬性

 div {
     position: absolute;        /* 相對定位或絕對定位都可 */
     width:500px;
     height:300px;
     top: 50%;
     left: 50%;
     transform: translate(-50%, -50%);
     background-color: pink;         /* 方便看效果 */

 }

(5)、水平垂直居中三:

 利用 flex 佈局
 實際使用時應考慮兼容性

 .container {
     display: flex;
     align-items: center;         /* 垂直居中 */
     justify-content: center;    /* 水平居中 */

 }
 .container div {
     width: 100px;
     height: 100px;
     background-color: pink;        /* 方便看效果 */
 } 

1五、position的值定位原點是?

回答:(1)、absolute:生成絕對定位的元素,相對於值不爲static的第一個父元素進行定位。

    (2)、relative:生成相對定位的元素,相對於元素正常位置進行定位。

    (3)、fixed(老IE不支持):生成絕對定位的元素,相對於瀏覽器窗口進行定位。

    (4)、static:默認值,沒有定位,元素出如今正常的流中。

    (5)、inherit:規定從父元素繼承position的值。

16:清除浮動的幾種方式?爲何要清除浮動呢?

回答:(1)、添加新的元素,應用clear:both;(額外標籤法)

.clear{clear:both; height: 0; line-height: 0; font-size: 0}

    (2)、父級div定義overflow:auto;

    (3)、使用:after方法,做用與浮動元素的父元素。(僞元素)

 .clearfix:after{

      content:"";//設置內容爲空

      height:0;//高度爲0

      line-height:0;//行高爲0

      display:block;//將文本轉爲塊級元素

      visibility:hidden;//將元素隱藏

      clear:both//清除浮動

     }

    .clearfix{

      zoom:1;爲了兼容IE(觸發IE的haslayout屬性)    
 
}

    (4)、使用雙僞元素

.clearfix:before,.clearfix:after {

                  content: "";

                  display: block;

                  clear: both;

            }

            .clearfix {

                  zoom: 1;

            }

緣由:若是一個盒子中有一個子盒子,而且父盒子沒有設置高,子盒子在父盒子中設置了浮動,那麼未來父盒子的高度就是0,下面的元素就會自動部位。(因此能夠給父級DIV定義height;也能夠父級DIV一塊兒浮動)。

當設置了zoom的值以後,所設置的元素就會就會擴大或者縮小,高度寬度就會從新計算了,這裏一旦改變zoom值時其實也會發生從新渲染,運用這個原理,也就解決了ie下子元素浮動時候父元素不隨着自動擴大的問題。

1七、css定義的權重?

回答:權重的規則:標籤的權重爲1,class的權重爲10,id的權重爲100,以下所示:(ps:若是權重相同,則最後定義的樣式會起做用,可是要避免這樣的狀況)

/*權重爲1*/
  div{
  }
  /*權重爲10*/
  .class1{
  }
  /*權重爲100*/
  #id1{
  }
  /*權重爲100+1=101*/
  #id1 div{
  }
  /*權重爲10+1=11*/
  .class1 div{
  }
  /*權重爲10+10+1=21*/
  .class1 .class2 div{
  }

1八、javascript做用域和閉包?

回答:變量做用域:包括全局變量和局部變量(函數內部能夠直接讀取全局變量&函數外部天然不能讀取函數內部的局部變量)。

(1)、函數做用域:函數的局部變量僅對函數內部可見。

(2)、詞法做用域:函數的嵌套關係是定義的時候決定的,而不是調用的時候決定的,即嵌套關係是詞法分析時肯定的,而非運行時決定。

(3)、全局做用域:在最外層定義的變量,全局對象的變量,任何地方隱匿定義的變量。

(4)、沒有塊級做用域。

閉包:就是可以讀取其餘函數內部變量的函數。也能夠理解成」定義在一個函數內部的函數」;

閉包的用途就是一能夠讀取函數內部的變量,二就是讓這些變量的值始終保存在內存中。(內存會消耗過大,因此不能濫用閉包)。

簡單的閉包例子:

 function f1(){
    var n=999;
    function f2(){
      alert(n); 
    }
    return f2;
  }
  var result=f1();
  result(); // 999

 1九、AJAX的步驟?

回答:(1)、建立ajax對象;(2)、發出HTTP請求;(3)、接收服務器傳回的數據;(4)、更新網頁數據。

20、一個頁面上兩個div左右鋪滿整個瀏覽器,要保證左邊的div一直爲100px,右邊的div跟隨瀏覽器大小變化(好比瀏覽器爲500,右邊就爲400;若是瀏覽器爲900,右邊爲800)?

回答:(1)、浮動佈局:

<div id="left">left sidebar</div>
<div id="content">Main Content</div>
<style type="text/css">
    *{
        margin: 0;
        padding: 0;
    }
    #left{
        float: left;
        width: 220px;
        background-color: green;
    }
    #content{
        background-color: orange;
        margin-left: 220px;
    }
</style>

2一、一個頁面從輸入URL到頁面加載顯示完成,這個過程發生了什麼?(流程說的越詳細越好)

回答:輸入地址

(1)、瀏覽器查找域名的IP地址,這一步包括DNS具體的查找過程(包括:瀏覽器緩存-》系統緩存-》路由器緩存...)(2)、瀏覽器向web服務器發送一個HTTP請求;(3)、服務器的永久重定向響應(從http://example.com到http://www.example.com);(5)、瀏覽器跟蹤重定向地址;(6)、服務器處理請求;(7)、服務器返回一個HTTP響應;(8)、瀏覽器顯示HTML;(9)、瀏覽器發送請求獲取嵌入在HTML中的 資源(如圖片、音頻、視頻、css、js等等);(10)、瀏覽器發送異步請求。     

2二、JS跨域請求的方式,能寫幾種寫幾種?                                                                             

回答:(1)、經過jsonp跨域;

(2)、經過修改document.domain來跨子域;

(3)、使用window.name來進行跨域;

(4)、使用HTML5新引進的window.postMessage方法來進行跨域(ie6 7不支持);

(5)、CORS須要服務器設置header:Access-Control-Allow-Origin;

(6)、nginx反向代理 這個方法能夠不用目標服務器配合,不過須要搭建一箇中轉nginx服務器,用於轉發請求。

相關文章
相關標籤/搜索