常見的前端面試大全

HTML

  • Doctype作用?標準模式與兼容模式各有什麼區別?

        (1)、<!DOCTYPE>聲明位於位於HTML文檔中的第一行,處於 <html> 標籤之前。告知瀏覽器的解析器用什麼文檔標準解析這個文檔。DOCTYPE不存在或格式不正確會導致文檔以兼容模式呈現。
    
        (2)、標準模式的排版 和JS運作模式都是以該瀏覽器支持的最高標準運行。在兼容模式中,頁面以寬鬆的向後兼容的方式顯示,模擬老式瀏覽器的行爲以防止站點無法工作。
    
  • HTML5 爲什麼只需要寫 <!DOCTYPE HTML>?

         HTML5 不基於 SGML,因此不需要對DTD進行引用,但是需要doctype來規範瀏覽器的行爲(讓瀏覽器按照它們應該的方式來運行);
    
         而HTML4.01基於SGML,所以需要對DTD進行引用,才能告知瀏覽器文檔所使用的文檔類型。
    
  • 行內元素有哪些?塊級元素有哪些? 空(void)元素有那些?

        首先:CSS規範規定,每個元素都有display屬性,確定該元素的類型,每個元素都有默認的display值,如div的display默認值爲“block”,則爲“塊級”元素;span默認display屬性值爲“inline”,是“行內”元素。
    
        (1)行內元素有:a b span img input select strong(強調的語氣)
        (2)塊級元素有:div ul ol li dl dt dd h1 h2 h3 h4…p
    
        (3)常見的空元素:
            <br> <hr> <img> <input> <link> <meta>
            鮮爲人知的是:
            <area> <base> <col> <command> <embed> <keygen> <param> <source> <track> <wbr>
    
  • 頁面導入樣式時,使用link和@import有什麼區別?

1link屬於XHTML標籤,除了加載CSS外,還能用於定義RSS, 定義rel連接屬性等作用;而@import是CSS提供的,只能用於加載CSS;

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

    (3)import是CSS2.1 提出的,只在IE5以上才能被識別,而link是XHTML標籤,無兼容問題;
  • 瀏覽器的內核分別是什麼?

    • IE瀏覽器的內核Trident、Mozilla的Gecko、Chrome的Blink(WebKit的分支)、Opera內核原爲Presto,現爲Blink;

  • 常見兼容性問題?

    • png24位的圖片在iE6瀏覽器上出現背景,解決方案是做成PNG8.

    • 瀏覽器默認的margin和padding不同。解決方案是加一個全局的*{margin:0;padding:0;}來統一。

    • IE6雙邊距bug:塊屬性標籤float後,又有橫行的margin情況下,在ie6顯示margin比設置的大。

      浮動ie產生的雙倍距離 #box{ float:left; width:10px; margin:0 0 0 100px;}

      這種情況之下IE會產生20px的距離,解決方案是在float的標籤樣式控制中加入 ——_display:inline;將其轉化爲行內屬性。(_這個符號只有ie6會識別)

      漸進識別的方式,從總體中逐漸排除局部。

      首先,巧妙的使用“\9”這一標記,將IE遊覽器從所有情況中分離出來。
      接着,再次使用“+”將IE8和IE7、IE6分離開來,這樣IE8已經獨立識別。

      css

        .bb{
         background-color:#f1ee18;/*所有識別*/
        .background-color:#00deff\9; /*IE6、7、8識別*/
        +background-color:#a200ff;/*IE6、7識別*/
        _background-color:#1e0bd1;/*IE6識別*/
        }
      
    • IE下,可以使用獲取常規屬性的方法來獲取自定義屬性,
      也可以使用getAttribute()獲取自定義屬性;
      Firefox下,只能使用getAttribute()獲取自定義屬性.
      解決方法:統一通過getAttribute()獲取自定義屬性.

    • IE下,even對象有x,y屬性,但是沒有pageX,pageY屬性;
      Firefox下,event對象有pageX,pageY屬性,但是沒有x,y屬性.

    • 解決方法:(條件註釋)缺點是在IE瀏覽器下可能會增加額外的HTTP請求數。

    • Chrome 中文界面下默認會將小於 12px 的文本強制按照 12px 顯示,
      可通過加入 CSS 屬性 -webkit-text-size-adjust: none; 解決.

      超鏈接訪問過後hover樣式就不出現了 被點擊訪問過的超鏈接樣式不在具有hover和active瞭解決方法是改變CSS屬性的排列順序:
      L-V-H-A : a:link {} a:visited {} a:hover {} a:active {}

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

    • HTML5 現在已經不是 SGML 的子集,主要是關於圖像,位置,存儲,多任務等功能的增加。

    • 繪畫 canvas
      用於媒介回放的 video 和 audio 元素
      本地離線存儲 localStorage 長期存儲數據,瀏覽器關閉後數據不丟失;
      sessionStorage 的數據在瀏覽器關閉後自動刪除

      語意化更好的內容元素,比如 article、footer、header、nav、section
      表單控件,calendar、date、time、email、url、search
      新的技術webworker, websockt, 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]-->
      如何區分: DOCTYPE聲明\新增的結構元素\功能元素

  • 語義化的理解?

       用正確的標籤做正確的事情!
       html語義化就是讓頁面的內容結構化,便於對瀏覽器、搜索引擎解析;
       在沒有樣式CCS情況下也以一種文檔格式顯示,並且是容易閱讀的。
       搜索引擎的爬蟲依賴於標記來確定上下文和各個關鍵字的權重,利於 SEO。
       使閱讀源代碼的人對網站更容易將網站分塊,便於閱讀維護理解。
    
  • HTML5的離線儲存?

       localStorage    長期存儲數據,瀏覽器關閉後數據不丟失;
       sessionStorage  數據在瀏覽器關閉後自動刪除。
    
  • (寫)描述一段語義的html代碼吧。

       (HTML5中新增加的很多標籤(如:<article><nav><header><footer>等)
        就是基於語義化設計原則)
           < div id="header">
           < h1>標題< /h1>
           < h2>專注Web前端技術< /h2>
           < /div>
    
  • iframe有那些缺點?

       *iframe會阻塞主頁面的Onload事件;
    
       *iframe和主頁面共享連接池,而瀏覽器對相同域的連接有限制,所以會影響頁面的並行加載。
       使用iframe之前需要考慮這兩個缺點。如果需要使用iframe,最好是通過javascript
       動態給iframe添加src屬性值,這樣可以可以繞開以上兩個問題。
    
  • HTML5的form如何關閉自動完成功能?

       給不想要提示的 form 或下某個input 設置爲 autocomplete=off
  • 請描述一下 cookies,sessionStorage 和 localStorage 的區別?

        cookie在瀏覽器和服務器間來回傳遞。 sessionStorage和localStorage不會
       sessionStorage和localStorage的存儲空間更大;
       sessionStorage和localStorage有更多豐富易用的接口;
       sessionStorage和localStorage各自獨立的存儲空間;
    
  • 如何實現瀏覽器內多個標籤頁之間的通信? (阿里)

       調用localstorge、cookies等本地存儲方式
    
  • webSocket如何兼容低瀏覽器?(阿里)

       Adobe Flash Socket 、 ActiveX HTMLFile (IE) 、 基於 multipart 編碼發送 XHR 、 基於長輪詢的 XHR
    

CSS

  • 介紹一下CSS的盒子模型?

        (1)有兩種, IE 盒子模型、標準 W3C 盒子模型;IE的content部分包含了 border 和 pading;
    
        (2)盒模型: 內容(content)、填充(padding)、邊界(margin)、 邊框(border).
    
  • CSS 選擇符有哪些?哪些屬性可以繼承?優先級算法如何計算? CSS3新增僞類有那些?

    • 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)
      
    • 可繼承的樣式: font-size font-family color, UL LI DL DD DT;

    • 不可繼承的樣式:border padding margin width height ;

    • 優先級就近原則,同權重情況下樣式定義最近者爲準;

    • 載入樣式以最後載入的定位爲準;

    優先級爲:

          !important >  id > class > tag
    
          important 比 內聯優先級高
    

    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        單選框或複選框被選中。
    
  • 如何居中div?如何居中一個浮動元素?

    • 給div設置一個寬度,然後添加margin:0 auto屬性

          div{
              width:200px;
              margin:0 auto;
           }
      
    • 居中一個浮動元素

            確定容器的寬高 寬500 高 300 的層
            設置層的外邊距
      
           .div {
            Width:500px ; height:300px;//高度可以不設
            Margin: -150px 0 0 -250px;
            position:relative;相對定位
            background-color:pink;//方便看效果
            left:50%;
            top:50%;
          }
      
  • 列出display的值,說明他們的作用。position的值, relative和absolute定位原點是?

      1.
      block 象塊類型元素一樣顯示。
      none 缺省值。象行內元素類型一樣顯示。
      inline-block 象行內元素一樣顯示,但其內容象塊類型元素一樣顯示。
      list-item 象塊類型元素一樣顯示,並添加樣式列表標記。

      2.
      *absolute
            生成絕對定位的元素,相對於 static 定位以外的第一個父元素進行定位。

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

      *relative
            生成相對定位的元素,相對於其正常位置進行定位。
    • static 默認值。沒有定位,元素出現在正常的流中
      *(忽略 top, bottom, left, right z-index 聲明)。

    • inherit 規定從父元素繼承 position 屬性的值。

  • CSS3有哪些新特性?

           CSS3實現圓角(border-radius:8px),陰影(box-shadow:10px),
         對文字加特效(text-shadow、),線性漸變(gradient),旋轉(transform)
         transform:rotate(9deg) scale(0.85,0.90) translate(0px,-30px) skew(-9deg,0deg);//旋轉,縮放,定位,傾斜
         增加了更多的CSS選擇器  多背景 rgba
    
  • 一個滿屏 品 字佈局 如何設計?

  • 經常遇到的CSS的兼容性有哪些?原因,解決方法是什麼?

  • 爲什麼要初始化CSS樣式。

    • 因爲瀏覽器的兼容問題,不同瀏覽器對有些標籤的默認值是不同的,如果沒對CSS初始化往往會出現瀏覽器之間的頁面顯示差異。

    1. 當然,初始化樣式會對SEO有一定的影響,但魚和熊掌不可兼得,但力求影響最小的情況下初始化。

      最簡單的初始化方法就是: {padding: 0; margin: 0;} (不建議)

      淘寶的樣式初始化:
      body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, dl, dt, dd, ul, ol, li, pre, form, fieldset, legend, button, input, textarea, th, td { margin:0; padding:0; }
      body, button, input, select, textarea { font:12px/1.5tahoma, arial, \5b8b\4f53; }
      h1, h2, h3, h4, h5, h6{ font-size:100%; }
      address, cite, dfn, em, var { font-style:normal; }
      code, kbd, pre, samp { font-family:couriernew, courier, monospace; }
      small{ font-size:12px; }
      ul, ol { list-style:none; }

    2. { text-decoration:none; }
      a:hover { text-decoration:underline; }
      sup { vertical-align:text-top; }
      sub{ vertical-align:text-bottom; }
      legend { color:#000; }
      fieldset, img { border:0; }
      button, input, select, textarea { font-size:100%; }
      table { border-collapse:collapse; border-spacing:0; }

  • absolute的containing block計算方式跟正常流有什麼不同?

  • position跟display、margin collapse、overflow、float這些特性相互疊加後會怎麼樣?

  • 對BFC規範的理解?

    (W3C CSS 2.1 規範中的一個概念,它決定了元素如何對其內容進行定位,以及與其他元素的關 系和相互作用。)
  • css定義的權重

        以下是權重的規則:標籤的權重爲1,class的權重爲10,id的權重爲100,以下例子是演示各種定義的權重值:
    
        /*權重爲1*/
        div{
        }
        /*權重爲10*/
        .class1{
        }
        /*權重爲100*/
        #id1{
        }
        /*權重爲100+1=101*/
        #id1 div{
        }
        /*權重爲10+1=11*/
        .class1 div{
        }
        /*權重爲10+10+1=21*/
        .class1 .class2 div{
        }
    
        如果權重相同,則最後定義的樣式會起作用,但是應該避免這種情況出現
    
  • 解釋下浮動和它的工作原理?清除浮動的技巧

  • 用過媒體查詢,針對移動端的佈局嗎?

  • 使用 CSS 預處理器嗎?喜歡那個?

        SASS
    
  • 如果需要手動寫動畫,你認爲最小時間間隔是多久,爲什麼?(阿里)

        多數顯示器默認頻率是60Hz,即1秒刷新60次,所以理論上最小間隔爲1/60*1000ms = 16.7ms
    
  • display:inline-block 什麼時候會顯示間隙?(攜程)

        移除空格、使用margin負值、使用font-size:0letter-spacingword-spacing
    

JavaScript

  • JavaScript原型,原型鏈 ? 有什麼特點?

  • 說幾條寫JavaScript的基本規範?

       1.不要在同一行聲明多個變量。
       2.請使用 ===/!==來比較true/false或者數值
       3.使用對象字面量替代new Array這種形式
       4.不要使用全局函數。
       5.Switch語句必須帶有default分支
       6.函數不應該有時候有返回值,有時候沒有返回值。
       7.For循環必須使用大括號
       8.If語句必須使用大括號
       9.for-in循環中的變量 應該使用var關鍵字明確限定作用域,從而避免作用域污染。
    
  • eval是做什麼的?

       它的功能是把對應的字符串解析成JS代碼並運行;
       應該避免使用eval,不安全,非常耗性能(2次,一次解析成js語句,一次執行)。
    
  • null,undefined 的區別?

  • 寫一個通用的事件偵聽器函數。

           // event(事件)工具集,來源:github.com/markyun
           markyun.Event = {
               // 頁面加載完成後
               readyEvent : function(fn) {
                   if (fn==null) {
                       fn=document;
                   }
                   var oldonload = window.onload;
                   if (typeof window.onload != 'function') {
                       window.onload = fn;
                   } else {
                       window.onload = function() {
                           oldonload();
                           fn();
                       };
                   }
               },
               // 視能力分別使用dom0||dom2||IE方式 來綁定事件
               // 參數: 操作的元素,事件名稱 ,事件處理程序
               addEvent : function(element, type, handler) {
                   if (element.addEventListener) {
                       //事件類型、需要執行的函數、是否捕捉
                       element.addEventListener(type, handler, false);
                   } else if (element.attachEvent) {
                       element.attachEvent('on' + type, function() {
                           handler.call(element);
                       });
                   } else {
                       element['on' + type] = handler;
                   }
               },
               // 移除事件
               removeEvent : function(element, type, handler) {
                   if (element.removeEventListener) {
                       element.removeEventListener(type, handler, false);
                   } else if (element.datachEvent) {
                       element.detachEvent('on' + type, handler);
                   } else {
                       element['on' + type] = null;
                   }
               },
               // 阻止事件 (主要是事件冒泡,因爲IE不支持事件捕獲)
               stopPropagation : function(ev) {
                   if (ev.stopPropagation) {
                       ev.stopPropagation();
                   } else {
                       ev.cancelBubble = true;
                   }
               },
               // 取消事件的默認行爲
               preventDefault : function(event) {
                   if (event.preventDefault) {
                       event.preventDefault();
                   } else {
                       event.returnValue = false;
                   }
               },
               // 獲取事件目標
               getTarget : function(event) {
                   return event.target || event.srcElement;
               },
               // 獲取event對象的引用,取到事件的所有信息,確保隨時能使用event;
               getEvent : function(e) {
                   var ev = e || window.event;
                   if (!ev) {
                       var c = this.getEvent.caller;
                       while (c) {
                           ev = c.arguments[0];
                           if (ev && Event == ev.constructor) {
                               break;
                           }
                           c = c.caller;
                       }
                   }
                   return ev;
               }
           };
    
  • Node.js的適用場景?

       高併發、聊天、實時消息推送
    
  • 介紹js的基本數據類型。

       number,string,boolean,object,undefined
    
  • Javascript如何實現繼承?

       通過原型和構造器
    
  • ["1", "2", "3"].map(parseInt) 答案是多少?

        [1, NaN, NaN] 因爲 parseInt 需要兩個參數 (val, radix),其中 radix 表示解析時用的基數。map 傳了 3 個 (element, index, array),對應的 radix 不合法導致解析失敗。
    
  • 如何創建一個對象? (畫出此對象的內存圖)

         function Person(name, age) {
           this.name = name;
           this.age = age;
           this.sing = function() { alert(this.name) }
         }
    
  • 談談This對象的理解。

       this是js的一個關鍵字,隨着函數使用場合不同,this的值會發生變化。
    
       但是有一個總原則,那就是this指的是調用函數的那個對象。
    
       this一般情況下:是全局對象Global。 作爲方法調用,那麼this就是指這個對象
    
  • 事件是?IE與火狐的事件機制有什麼區別? 如何阻止冒泡?

    1. 我們在網頁中的某個操作(有的操作對應多個事件)。例如:當我們點擊一個按鈕就會產生一個事件。是可以被 JavaScript 偵測到的行爲。

    2. 事件處理機制:IE是事件冒泡、火狐是 事件捕獲;

    3. ev.stopPropagation();

  • 什麼是閉包(closure),爲什麼要用它?

    執行say667()後,say667()閉包內部變量會存在,而閉包內部函數的內部變量不會存在.使得Javascript的垃圾回收機制GC不會收回say667()所佔用的資源,因爲say667()的內部函數的執行需要依賴say667()中的變量。這是對閉包作用的非常直白的描述.

      function say667() {
        // Local variable that ends up within closure
        var num = 666;
        var sayAlert = function() { alert(num); }
        num++;
        return sayAlert;
    }

     var sayAlert = say667();
     sayAlert()//執行結果應該彈出的667
  • "use strict";是什麼意思 ? 使用它的好處和壞處分別是什麼?

  • 如何判斷一個對象是否屬於某個類?

       使用instanceof (待完善)

       if(a instanceof Person){
           alert('yes');
       }
  • new操作符具體幹了什麼呢?

             1、創建一個空對象,並且 this 變量引用該對象,同時還繼承了該函數的原型。
                 2、屬性和方法被加入到 this 引用的對象中。
              3、新創建的對象由 this 所引用,並且最後隱式的返回 thisvar obj  = {};
        obj.__proto__ = Base.prototype;
        Base.call(obj);
    
  • Javascript中,有一個函數,執行時對象查找時,永遠不會去查找原型,這個函數是?

        hasOwnProperty
    
  • JSON 的瞭解?

        JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。
        它是基於JavaScript的一個子集。數據格式簡單, 易於讀寫, 佔用帶寬小
        {"age":"12", "name":"back"}
    
  • js延遲加載的方式有哪些?

        defer和async、動態創建DOM方式(用得最多)、按需異步載入js
    
  • ajax 是什麼?

  • 同步和異步的區別?

  • 如何解決跨域問題?

    jsonp、 iframe、window.name、window.postMessage、服務器上設置代理頁面
  • 模塊化怎麼做?

 [ 立即執行函數](http://benalman.com/news/2010/11/immediately-invoked-function-expression/),不暴露私有成員

        var module1 = (function(){
            var _count = 0;
            var m1 = function(){
              //...
            };
            var m2 = function(){
              //...
            };
            return {
              m1 : m1,
              m2 : m2
            };
          })();
  • AMD(Modules/Asynchronous-Definition)、CMD(Common Module Definition)規範區別?

  • 異步加載的方式有哪些?

      (1) defer,只支持IE

      (2) async:

      (3) 創建script,插入到DOM中,加載完畢後callBack
  • documen.write和 innerHTML的區別

document.write只能重繪整個頁面

innerHTML可以重繪頁面的一部分

  • .call() 和 .apply() 的區別?

      例子中用 add 來替換 sub,add.call(sub,3,1) == add(3,1) ,所以運行結果爲:alert(4);

      注意:js 中的函數其實是對象,函數名是對 Function 對象的引用。

        function add(a,b)
        {
            alert(a+b);
        }

        function sub(a,b)
        {
            alert(a-b);
        }

        add.call(sub,3,1);
  • Jquery與jQuery UI 有啥區別?

    *jQuery是一個js庫,主要提供的功能是選擇器,屬性修改和事件綁定等等。

    *jQuery UI則是在jQuery的基礎上,利用jQuery的擴展性,設計的插件。
     提供了一些常用的界面元素,諸如對話框、拖動行爲、改變大小行爲等等
  • JQuery的源碼看過嗎?能不能簡單說一下它的實現原理?

  • jquery 中如何將數組轉化爲json字符串,然後再轉化回來?

jQuery中沒有提供這個功能,所以你需要先編寫兩個jQuery的擴展:

    $.fn.stringifyArray = function(array) {
        return JSON.stringify(array)
    }

    $.fn.parseArray = function(array) {
        return JSON.parse(array)
    }

    然後調用:
    $("").stringifyArray(array)
  • 針對 jQuery 的優化方法?

        *基於Class的選擇性的性能相對於Id選擇器開銷很大,因爲需遍歷所有DOM元素。
    
        *頻繁操作的DOM,先緩存起來再操作。用Jquery的鏈式調用更好。
         比如:var str=$("a").attr("href");
    
        *for (var i = size; i < arr.length; i++) {}
         for 循環每一次循環都查找了數組 (arr) 的.length 屬性,在開始循環的時候設置一個變量來存儲這個數字,可以讓循環跑得更快:
         for (var i = size, length = arr.length; i < length; i++) {}
    
  • JavaScript中的作用域與變量聲明提升?

  • 如何編寫高性能的Javascript?

  • 那些操作會造成內存泄漏?

    內存泄漏指任何對象在您不再擁有或需要它之後仍然存在。
    垃圾回收器定期掃描對象,並計算引用了每個對象的其他對象的數量。如果一個對象的引用數量爲 0(沒有其他對象引用過該對象),或對該對象的惟一引用是循環的,那麼該對象的內存即可回收。

    setTimeout 的第一個參數使用字符串而非函數的話,會引發內存泄漏。
    閉包、控制檯日誌、循環(在兩個對象彼此引用且彼此保留時,就會產生一個循環)
  • JQuery一個對象可以同時綁定多個事件,這是如何實現的?

  • 如何判斷當前腳本運行在瀏覽器還是node環境中?(阿里)

        通過判斷Global對象是否爲window,如果不爲window,當前腳本沒有運行在瀏覽器中
    

其他

  • 你遇到過比較難的技術問題是?你是如何解決的?

  • 常使用的庫有哪些?常用的前端開發工具?開發過什麼應用或組件?

  • 頁面重構怎麼操作?

  • 列舉IE 與其他瀏覽器不一樣的特性?

  • 99%的網站都需要被重構是那本書上寫的?

  • 什麼叫優雅降級和漸進增強?

  • WEB應用從服務器主動推送Data到客戶端有那些方式?

  • 對Node的優點和缺點提出了自己的看法?

    *(優點)因爲Node是基於事件驅動和無阻塞的,所以非常適合處理併發請求,
      因此構建在Node上的代理服務器相比其他技術實現(如Ruby)的服務器表現要好得多。
      此外,與Node代理服務器交互的客戶端代碼是由javascript語言編寫的,
      因此客戶端和服務器端都用同一種語言編寫,這是非常美妙的事情。

    *(缺點)Node是一個相對新的開源項目,所以不太穩定,它總是一直在變,
      而且缺少足夠多的第三方庫支持。看起來,就像是Ruby/Rails當年的樣子。
  • 你有哪些性能優化的方法?

     (看雅虎14條性能優化原則)。

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

      (2) 前端模板 JS+數據,減少由於HTML標籤導致的帶寬浪費,前端用變量保存AJAX請求結果,每次操作本地變量,不用請求,減少請求次數

      (3) 用innerHTML代替DOM操作,減少DOM操作次數,優化javascript性能。

      (4) 當需要設置的樣式很多時設置className而不是直接操作style。

      (5) 少用全局變量、緩存DOM節點查找的結果。減少IO讀取操作。

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

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

      (8) 避免在頁面的主體佈局中使用table,table要等其中的內容完全下載之後纔會顯示出來,顯示比div+css佈局慢。
      對普通的網站有一個統一的思路,就是儘量向前端優化、減少數據庫操作、減少磁盤IO。向前端優化指的是,在不影響功能和體驗的情況下,能在瀏覽器執行的不要在服務端執行,能在緩存服務器上直接返回的不要到應用服務器,程序能直接取得的結果不要到外部取得,本機內能取得的數據不要到遠程取,內存能取到的不要到磁盤取,緩存中有的不要去數據庫查詢。減少數據庫操作指減少更新次數、緩存結果減少查詢次數、將數據庫執行的操作儘可能的讓你的程序完成(例如join查詢),減少磁盤IO指儘量不使用文件系統作爲緩存、減少讀寫文件次數等。程序優化永遠要優化慢的部分,換語言是無法“優化”的。
  • http狀態碼有那些?分別代表是什麼意思?

        100-199 用於指定客戶端應相應的某些動作。
        200-299 用於表示請求成功。
        300-399 用於已經移動的文件並且常被包含在定位頭信息中指定新的地址信息。
        400-499 用於指出客戶端的錯誤。400    1、語義有誤,當前請求無法被服務器理解。401    當前請求需要用戶驗證 403    服務器已經理解請求,但是拒絕執行它。
        500-599 用於支持服務器錯誤。 503 – 服務不可用
    
  • 一個頁面從輸入 URL 到頁面加載顯示完成,這個過程中都發生了什麼?(流程說的越詳細越好)

        查找瀏覽器緩存
        DNS解析、查找該域名對應的IP地址、重定向(301)、發出第二個GET請求
        進行HTTP協議會話
        客戶端發送報頭(請求報頭)
        服務器回饋報頭(響應報頭)
        html文檔開始下載
        文檔樹建立,根據標記請求所需指定MIME類型的文件
        文件顯示
        [
        瀏覽器這邊做的工作大致分爲以下幾步:

        加載:根據請求的URL進行域名解析,向服務器發起請求,接收文件(HTML、JS、CSS、圖象等)。

        解析:對加載到的資源(HTML、JS、CSS等)進行語法解析,建議相應的內部數據結構(比如HTML的DOM樹,JS的(對象)屬性表,CSS的樣式規則等等)
        }
  • 除了前端以外還了解什麼其它技術麼?你最最厲害的技能是什麼?

  • 你常用的開發工具是什麼,爲什麼?

  • 對前端界面工程師這個職位是怎麼樣理解的?它的前景會怎麼樣?

             前端是最貼近用戶的程序員,比後端、數據庫、產品經理、運營、安全都近。
            1、實現界面交互
            2、提升用戶體驗
            3、有了Node.js,前端可以實現服務端的一些事情
    
    前端是最貼近用戶的程序員,前端的能力就是能讓產品從 90分進化到 100 分,甚至更好,

     參與項目,快速高質量完成實現效果圖,精確到1px;

     與團隊成員,UI設計,產品經理的溝通;

     做好的頁面結構,頁面重構和用戶體驗;

     處理hack,兼容、寫出優美的代碼格式;

     針對服務器的優化、擁抱最新前端技術。
  • 加班的看法?

       加班就像借錢,原則應當是------救急不救窮
  • 平時如何管理你的項目?

                先期團隊必須確定好全局樣式(globe.css),編碼模式(utf-8) 等;
    
                編寫習慣必須一致(例如都是採用繼承式的寫法,單樣式都寫成一行);
    
                標註樣式編寫人,各模塊都及時標註(標註關鍵樣式調用的地方);
    
                頁面進行標註(例如 頁面 模塊 開始和結束);
    
                CSS跟HTML 分文件夾並行存放,命名都得統一(例如style.css);
    
                JS 分文件夾存放 命名以該JS功能爲準的英文翻譯。
    
                圖片採用整合的 images.png png8 格式文件使用 儘量整合在一起使用方便將來的管理
  • 如何設計突發大規模併發架構?

  • 說說最近最流行的一些東西吧?常去哪些網站?

            Node.js、Mongodb、npm、MVVM、MEAN、three.js
    
  • 移動端(Android IOS)怎麼做好用戶體驗?

            清晰的視覺縱線、信息的分組、極致的減法、
            利用選擇代替輸入、標籤及文字的排布方式、
            依靠明文確認密碼、合理的鍵盤利用、
    
  • 你在現在的團隊處於什麼樣的角色,起到了什麼明顯的作用?

  • 你認爲怎樣纔是全端工程師(Full Stack developer)?

  • 介紹一個你最得意的作品吧?

  • 你的優點是什麼?缺點是什麼?

  • 如何管理前端團隊?

  • 最近在學什麼?能談談你未來3,5年給自己的規劃嗎?

十道javascript 筆試題

1、考察this

var length = 10;
function fn() {
  console.log(this.length);
}

var obj = {
  length: 5,
  method: function(fn) {
    fn();
    arguments[0]();
  }
};

obj.method(fn, 1);

輸出:10 2

第一次輸出10應該沒有問題。我們知道取對象屬於除了點操作符還可以用中括號,所以第二次執行時相當於arguments調用方法,this指向arguments,而這裏傳了兩個參數,故輸出arguments長度爲2。

2、var和函數的提前聲明

function fn(a) {
  console.log(a); 
  var a = 2;
  function a() {}
  console.log(a); 
}

fn(1);

輸出:function  a() {} 2

我們知道var和function是會提前聲明的,而且function是優先於var聲明的(如果同時存在的話),所以提前聲明後輸出的a是個function,然後代碼往下執行a進行重新賦值了,故第二次輸出是2。

3、局部變量和全局變量

var f = true;
if (f === true) {
  var a = 10;
}

function fn() {
  var b = 20;
  c = 30;
}

fn();
console.log(a);
console.log(b);
console.log(c);

輸出:10 報錯 30

這是個我犯了很久的錯誤,很長一段時間我都以爲{...}內的新聲明的變量是局部變量,後來我才發現function內的新聲明的變量纔是局部變量,而沒有用var聲明的變量在哪裏都是全局變量。再次提醒切記只有function(){}內新聲明的才能是局部變量,while{...}、if{...}、for(..) 之內的都是全局變量(除非本身包含在function內)。

4、變量隱式聲明

if('a' in window) {
  var a = 10;
}

alert(a);

答案:10

前面我說過function和var會提前聲明,而其實{...}內的變量也會提前聲明。於是代碼還沒執行前,a變量已經被聲明,於是 'a' in window 返回true,a被賦值。

5、給基本類型數據添加屬性,不報錯,但取值時是undefined

var a = 10;
a.pro = 10;
console.log(a.pro + a);

var s = 'hello';
s.pro = 'world';
console.log(s.pro + s);

答案: NaN  undefinedhello 

給基本類型數據加屬性不報錯,但是引用的話返回undefined,10+undefined返回NaN,而undefined和string相加時轉變成了字符串。

6、函數聲明優於變量聲明

console.log(typeof fn);
function fn() {};
var fn;

答案:function

因爲函數聲明優於變量聲明。我們知道在代碼逐行執行前,函數聲明和變量聲明會提前進行,而函數聲明又會優於變量聲明,這裏的優於可以理解爲晚於變量聲明後,如果函數名和變量名相同,函數聲明就能覆蓋變量聲明。所以以上代碼將函數聲明和變量聲明調換順序還是一樣結果。

7、判斷一個字符串中出現次數最多的字符,並統計次數

  • hash table方式:
var s = 'aaabbbcccaaabbbaaa';
var obj = {};
var maxn = -1;
var letter;
for(var i = 0; i < s.length; i++) {
  if(obj[s[i]]) {
    obj[s[i]]++;
    if(obj[s[i]] > maxn) {
      maxn = obj[s[i]];
      letter = s[i];
    }
  } else {
    obj[s[i]] = 1;
    if(obj[s[i]] > maxn) {
      maxn = obj[s[i]];
      letter = s[i];
    }
  }
}

alert(letter + ': ' + maxn);
  • 正則方式:
var s = 'aaabbbcccaaabbbaaabbbbbbbbbb';
var a = s.split('');
a.sort();
s = a.join('');
var pattern = /(\w)\1*/g;
var ans = s.match(pattern);
ans.sort(function(a, b) {
  return a.length < b.length;
});;
console.log(ans[0][0] + ': ' + ans[0].length);

8、經典閉包

<!-- 實現一段腳本,使得點擊對應鏈接alert出相應的編號 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<body>
  <a href='#'> 第一個鏈接 </a> </br>
  <a href='#'> 第二個鏈接 </a> </br>
  <a href='#'> 第三個鏈接 </a> </br>
  <a href='#'> 第四個鏈接 </a> </br>
</body>
  • dom污染法:
<!-- 實現一段腳本,使得點擊對應鏈接alert出相應的編號 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<body>
  <a href='#'> 第一個鏈接 </a> </br>
  <a href='#'> 第二個鏈接 </a> </br>
  <a href='#'> 第三個鏈接 </a> </br>
  <a href='#'> 第四個鏈接 </a> </br>
  <script type="text/javascript">
    var lis = document.links;
    for(var i = 0, length = lis.length; i < length; i++) {
      lis[i].index = i;
      lis[i].onclick = function() {
        alert(this.index);
      };
    }
  </script>
</body>
  • 閉包:
<!-- 實現一段腳本,使得點擊對應鏈接alert出相應的編號 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<body>
  <a href='#'> 第一個鏈接 </a> </br>
  <a href='#'> 第二個鏈接 </a> </br>
  <a href='#'> 第三個鏈接 </a> </br>
  <a href='#'> 第四個鏈接 </a> </br>
  <script type="text/javascript">
    var lis = document.links;
    for(var i = 0, length = lis.length; i < length; i++) {
      (function(i) {
        lis[i].onclick = function() {
          alert(i + 1);
        };
      })(i); 
    }
  </script>
</body>

9、this

function JSClass() {
  this.m_Text = 'division element';
  this.m_Element = document.createElement('div');
  this.m_Element.innerHTML = this.m_Text;
  this.m_Element.addEventListener('click', this.func);
  // this.m_Element.onclick = this.func;
}

JSClass.prototype.Render = function() {
  document.body.appendChild(this.m_Element);
}

JSClass.prototype.func = function() {
  alert(this.m_Text);
};

var jc = new JSClass();
jc.Render();  // add div
jc.func();  // 輸出 division element
//click添加的div元素division element會輸出underfined,爲什麼?

答案:division element undefined

第一次輸出很好理解,第二次的話仔細看,this其實已經指向了this.m_Element,因爲是this.m_Element調用的addEventListener函數,所以內部的this全指向它了。可以試着加上一行代碼this.m_Element.m_Text = 'hello world',就會alert出hello world了。

10、split

請編寫一個JavaScript函數 parseQueryString,它的用途是把URL參數解析爲一個對象,如: var url = “http://witmax.cn/index.php?key0=0&key1=1&key2=2″

function parseQueryString(url) {
  var obj = {};
  var a = url.split('?');
  if(a === 1) return obj;
  var b = a[1].split('&');
  for(var i = 0, length = b.length; i < length; i++) {
    var c = b[i].split('=');
    obj[c[0]] = c[1];
  }
  return obj;
}
var url = 'http://witmax.cn/index.php?key0=0&key1=1&key2=2';
var obj = parseQueryString(url);
console.log(obj.key0, obj.key1, obj.key2);  // 0 1 2 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章