前端javascript知識(一)

  • 介紹一下 JS 的基本數據類型。
    Undefined、Null、Boolean、Number、String
  • 介紹一下 JS 有哪些內置對象。
    Object 是 JavaScript 中全部對象的父對象
    數據封裝類對象:Object、Array、Boolean、Number、String
    其餘對象:Function、Argument、Math、Date、RegExp、Error
  • 列舉幾條 JavaScript 的基本代碼規範。
    (1)不要在同一行聲明多個變量
    (2)若是你不知道數組的長度,使用 push
    (3)請使用 ===/!== 來比較 true/false 或者數值
    (4)對字符串使用單引號 ''(由於大多時候咱們的字符串。特別html會出現")
    (5)使用對象字面量替代 new Array 這種形式
    (6)絕對不要在一個非函數塊裏聲明一個函數,把那個函數賦給一個變量。瀏覽器容許你這麼作,可是它們解析不一樣
    (7)不要使用全局函數
    (8)老是使用 var 來聲明變量,若是不這麼作將致使產生全局變量,咱們要避免污染全局命名空間
    (9)Switch 語句必須帶有 default 分支
    (10)使用 /**...*/ 進行多行註釋,包括描述,指定類型以及參數值和返回值
    (11)函數不該該有時候有返回值,有時候沒有返回值
    (12)語句結束必定要加分號
    (13)for 循環必須使用大括號
    (14)if 語句必須使用大括號
    (15)for-in 循環中的變量應該使用 var 關鍵字明確限定做用域,從而避免做用域污染
    (16)避免單個字符名,讓你的變量名有描述意義
    (17)當命名對象、函數和實例時使用駝峯命名規則
    (18)給對象原型分配方法,而不是用一個新的對象覆蓋原型,覆蓋原型會使繼承出現問題
    (19)當給事件附加數據時,傳入一個哈希而不是原始值,這可讓後面的貢獻者加入更多數據到事件數據裏,而不用找出並更新那個事件的事件處理器
  • call和apply的做用是什麼?區別是什麼?
    call和apply的功能基本相同,都是實現繼承或者轉換對象指針的做用;
    惟一不通的是前者參數是羅列出來的,後者是存到數組中的;
    call或apply功能就是實現繼承的;與面向對象的繼承extends功能類似;但寫法不一樣;
    語法:
    .call(對象[,參數1,參數2,....]);//此地參數是指的是對象的參數,非方法的參數;
    .apply(對象,參數數組)//參數數組的形式:[參數1,參數2,......]
  • push()-pop()-shift()-unshift()分別是什麼功能?
    push 方法
    將新元素添加到一個數組中,並返回數組的新長度值。
    var a=[1,2,3,4];
    a.push(5);
    pop 方法
    移除數組中的最後一個元素並返回該元素。
    var a=[1,2,3,4];
    a.pop();
    shift 方法
    移除數組中的第一個元素並返回該元素。
    var a=[1,2];
    alert(a.shift());
    unshift 方法
    將指定的元素插入數組開始位置並返回該數組。
  • 試寫出大於1024並小於1360屏幕的媒體查詢關鍵CSS代碼
    if ((screen.width == 1360) && (screen.height == 1024)){
      setActiveStyleSheet(CSS1);
    }
  • 表述您對javascript this工做原理的理解
    在函數中:this 一般是一個隱含的參數。
    在函數外(頂級做用域中):在瀏覽器中this 指的是全局對象;在Node.js中指的是模塊(module)的導出(exports)。
    傳遞到eval()中的字符串:若是eval()是被直接調用的,this 指的是當前對象;若是eval()是被間接調用的,this 就是指全局對象。
  • 介紹一下 JavaScript 原型,原型鏈,它們有何特色?
    每一個對象都會在其內部初始化一個屬性,就是prototype(原型),當咱們訪問一個對象的屬性時,若是這個對象內部不存在這個屬性,那麼他就會去prototype裏找這個屬性,這個prototype又會有本身的prototype,因而就這樣一直找下去,也就是咱們平時所說的原型鏈的概念。
    關係:instance.constructor.prototype = instance.__proto__
    特色:JavaScript對象是經過引用來傳遞的,咱們建立的每一個新對象實體中並無一份屬於本身的原型副本,當咱們修改原型時,與之相關的對象也會繼承這一改變。
    當咱們須要一個屬性時,JavaScript引擎會先看當前對象中是否有這個屬性,若是沒有的話,就會查找它的prototype對象是否有這個屬性,如此遞推下去,一致檢索到Object內建對象。
    function Func(){}
    Func.prototype.name = "Xiaosong";
    Func.prototype.getInfo = function() {
     return this.name;
    }
    var person = new Func();
    console.log(person.getInfo());//"Xiaosong"
    console.log(Func.prototype);//Func { name = "Xiaosong", getInfo = function() }
  • JavaScript 有幾種類型的值?可否畫一下它們的內存圖?
    棧:原始數據類型(Undefined,Null,Boolean,Number,String)
    堆:引用數據類型(對象、數組、函數)
    兩種類型的區別:
    //存儲位置不一樣
    原始數據類型直接存儲在棧(stack)中的簡單數據段,佔據空間小、大小固定,屬於被頻繁使用數據,因此放入棧中存儲;
    引用數據類型存儲在堆(heap)中的對象,佔據空間大、大小不固定,若是存儲在棧中,將會影響程序運行的性能;引用數據類型在棧中存儲了指針,該指針指向堆中該實體的起始地址。當解釋器尋找引用值時,會首先檢索其在棧中的地址,取得地址後從堆中得到實體。
    JavaScript 如何實現繼承?
    (1)構造繼承
    (2)原型繼承
    (3)實例繼承
    (4)拷貝繼承
    //原型prototype機制或apply和call方法去實現較簡單,建議使用構造函數與原型混合方式。
    function Parent() { 
      this.name = 'song';
    }
    function Child() {
      this.age = 28;
    }
    Child.prototype = new Parent(); //經過原型,繼承了Parent
    var demo = new Child();
    alert(demo.age);
    alert(demo.name); //獲得被繼承的屬性
  • JavaScript 有哪幾種建立對象的方式?
    javascript建立對象簡單的說,無非就是使用內置對象或各類自定義對象,固然還能夠用JSON;但寫法有不少種,也能混合使用。
    //
    (1)對象字面量的方式
    person={firstname:"Mark",lastname:"Yun",age:25,eyecolor:"black"};
    (2)用function來模擬無參的構造函數
    function Person(){}
    var person = new Person(); //定義一個function,若是使用new"實例化",該function能夠看做是一個Class
    person.name = "Xiaosong";
    person.age = "23";
    person.work = function() {
       alert("Hello " + person.name);
    }
    person.work();
    (3)用function來模擬參構造函數來實現(用this關鍵字定義構造的上下文屬性)
    function Person(name,age,hobby) { 
      this.name = name; //this做用域:當前對象
      this.age = age; 
      this.work = work; 
      this.info = function() { 
          alert("我叫" + this.name + ",今年" + this.age + "歲,是個" + this.work); 
      }
    }
    var Xiaosong = new Person("WooKong",23,"程序猿"); //實例化、建立對象
    Xiaosong.info(); //調用info()方法
    (4)用工廠方式來建立(內置對象)
    var jsCreater = new Object();
    jsCreater.name = "Brendan Eich"; //JavaScript的發明者
    jsCreater.work = "JavaScript";
    jsCreater.info = function() { 
      alert("我是"+this.work+"的發明者"+this.name);
    }
    jsCreater.info();
    (5)用原型方式來建立
    function Standard(){}
    Standard.prototype.name = "ECMAScript";
    Standard.prototype.event = function() { 
      alert(this.name+"是腳本語言標準規範");
    }
    var jiaoben = new Standard();
    jiaoben.event();
    (6)用混合方式來建立
    function iPhone(name,event) {
       this.name = name;
       this.event = event;
    }
    iPhone.prototype.sell = function() { 
      alert("我是"+this.name+",我是iPhone5s的"+this.event+"~ haha!");
    }
    var SE = new iPhone("iPhone SE","官方翻新機");
    SE.sell();
  • eval 是作什麼的?
    它的功能是把對應的字符串解析成JS代碼並運行;
    應該避免使用eval,由於不安全,很是耗性能(2次,一次解析成js語句,一次執行)。
  • null 和 undefined 有何區別?
    null 表示一個對象被定義了,值爲「空值」;
    undefined 表示不存在這個值。
    typeof undefined //"undefined"
    undefined :是一個表示"無"的原始值或者說表示"缺乏值",就是此處應該有一個值,可是尚未定義。當嘗試讀取時會返回 undefined; 
    例如變量被聲明瞭,但沒有賦值時,就等於undefined。
    typeof null //"object" 
    null : 是一個對象(空對象, 沒有任何屬性和方法); 
    例如做爲函數的參數,表示該函數的參數不是對象;
    注意: 在驗證null時,必定要使用 === ,由於 == 沒法分別 null 和 undefined
  • 可否寫一個通用的事件偵聽器函數?
    //Event工具集,from:github.com/markyunmarkyun.
    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();
             }; 
        }
      }, 
        //視能力分別使用 demo0 || demo1 || 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.datachEvent('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.srcElemnt; 
       },
       //獲取event對象的引用,取到事件的全部信息,確保隨時能使用event; 
       getEvent: function(e) { 
          var ev = e || window.event;
          if (!ev) { 
              var c = this.getEvent.caller; 
              while(c) { 
                  ev = c.argument[0]; 
                  if (ev && Event == ev.constructor) {
                       break; 
                  } 
                  c = c.caller; 
              } 
          } 
          retrun ev; 
        }
    };
  • ["1","2","3"].map(parseInt) 的答案是多少?
    [1,NaN,NaN]
    由於 parseInt 須要兩個參數(val,radix),其中 radix 表示解析時用的基數。
    map 傳了3個(element,index,array),對應的 radix 不合法致使解析失敗。
  • 事件是什麼?IE與火狐的事件機制有何區別?如何阻止冒泡?
    (1)咱們在網頁中的某個操做(有的操做對應多個事件)。
      例如:當咱們點擊一個按鈕就會產生一個事件。是能夠被 JavaScript 偵測到的行爲。
    (2)事件處理機制:IE是事件冒泡、Firefox同時支持兩種事件模型,也就是:捕獲型事件和冒泡型事件;
    (3)ev.stopPropagation();(舊ie的方法 ev.cancelBubble = true;)
  • 什麼是閉包(closure),爲何要用它?
    閉包是指有權訪問另外一個函數做用域中變量的函數,建立閉包的最多見的方式就是在一個函數內建立另外一個函數,經過另外一個函數訪問這個函數的局部變量,利用閉包能夠突破做用鏈域,將函數內部的變量和方法傳遞到外部。
    //閉包特性:
    (1)函數內再嵌套函數
    (2)內部函數能夠引用外層的參數和變量
    (3)參數和變量不會被垃圾回收機制回收
    //li節點的onclick事件都能正確的彈出當前被點擊的li索引
    <ul> 
      <li> index = 0 </li> 
      <li> index = 1 </li> 
      <li> index = 2 </li> 
      <li> index = 3 </li>
    </ul>
    <script type="text/javascript"> 
      var nodes = document.getElementsByTagName('li'); 
      for(i = 0;i<nodes.length;i+=1) { 
          nodes[i].onclick = function() { 
              console.log(i+1); //不使用閉包的話,值每次都是4 
          }(4);
       }
    </script>
  • JavaScript 代碼中的 "use strict"; 是什麼意思?使用它的區別是什麼?
    use strict是一種ECMAscript 5 添加的(嚴格)運行模式,這種模式使得 Javascript 在更嚴格的條件下運行,使JS編碼更加規範化的模式,消除Javascript語法的一些不合理、不嚴謹之處,減小一些怪異行爲。
    默認支持的糟糕特性都會被禁用,好比不能用with,也不能在乎外的狀況下給全局變量賦值;
    全局變量的顯示聲明,函數必須聲明在頂層,不容許在非函數代碼塊內聲明函數,arguments.callee也不容許使用;
    消除代碼運行的一些不安全之處,保證代碼運行的安全,限制函數中的arguments修改,嚴格模式下的eval函數的行爲和非嚴格模式的也不相同;
    提升編譯器效率,增長運行速度;
    爲將來新版本的Javascript標準化作鋪墊。
  • new 操做符具體幹了什麼呢?
    (1)建立一個空對象,而且 this 變量引用該對象,同時還繼承了該函數的原型。
    (2)屬性和方法被加入到 this 引用的對象中。
    (3)新建立的對象由 this 所引用,而且最後隱式的返回 this 。
    //
    var obj = {};
    obj.__proto__ = Base.prototype;
    Base.call(obj);
  • JavaScript 中,有一個函數,執行對象查找時,永遠不會去查找原型,這個函數是哪一個?
    hasOwnProperty
    //
    JavaScript 中 hasOwnProperty 函數方法是返回一個布爾值,指出一個對象是否具備指定名稱的屬性。此方法沒法檢查該對象的原型鏈中是否具備該屬性;該屬性必須是對象自己的一個成員。
    //
    使用方法:object.hasOwnProperty(proName)其中參數object是必選項,一個對象的實例。proName是必選項,一個屬性名稱的字符串值。
    //
    若是 object 具備指定名稱的屬性,那麼JavaScript中hasOwnProperty函數方法返回 true,反之則返回 false。
  • 你對 JSON 瞭解嗎?
    JSON(JavaScript Object Notation)是一種輕量級的數據交換格式。
    它是基於JavaScript的一個子集。數據格式簡單,易於讀寫,佔用帶寬小。
    如:{"age":"12", "name":"back"}
  • Ajax 是什麼?如何建立一個 Ajax ?
    ajax的全稱:Asynchronous Javascript And XML,異步傳輸+js+xml。
    所謂異步,在這裏簡單地解釋就是:向服務器發送請求的時候,咱們沒必要等待結果,而是能夠同時作其餘的事情,等到有告終果它本身會根據設定進行後續操做,與此同時,頁面是不會發生整頁刷新的,提升了用戶體驗。
    //
    (1)建立XMLHttpRequest對象,也就是建立一個異步調用對象
    (2)建立一個新的HTTP請求,並指定該HTTP請求的方法、URL及驗證信息
    (3)設置響應HTTP請求狀態變化的函數
    (4)發送HTTP請求
    (5)獲取異步調用返回的數據
    (6)使用JavaScript和DOM實現局部刷新
  • 同步和異步的區別?
    同步的概念應該是來自於操做系統中關於同步的概念:不一樣進程爲協同完成某項工做而在前後次序上調整(經過阻塞,喚醒等方式)。
    同步強調的是順序性,誰先誰後;異步則不存在這種順序性。
    //
    同步:瀏覽器訪問服務器請求,用戶看獲得頁面刷新,從新發請求,等請求完,頁面刷新,新內容出現,用戶看到新內容,進行下一步操做。
    //
    異步:瀏覽器訪問服務器請求,用戶正常操做,瀏覽器後端進行請求。等請求完,頁面不刷新,新內容也會出現,用戶看到新內容。
  • 如何解決跨域問題?
    jsonp、iframe、window.name、window.postMessage、服務器上設置代理頁面
  • 談一談你對 ECMAScript6 的瞭解?
    ECMAScript 6 是JavaScript語言的下一代標準,已經在2015年6月正式發佈了。
    它的目標,是使得JavaScript語言能夠用來編寫複雜的大型應用程序,成爲企業級開發語言。
    標準的制定者有計劃,之後每一年發佈一次標準,使用年份做爲標準的版本。
    由於當前版本的ES6是在2015年發佈的,因此又稱ECMAScript 2015。
    也就是說,ES6就是ES2015
  • ECMAScript 6 怎麼寫 class ,爲什麼會出現 class?
    ES6的class能夠看做只是一個語法糖,它的絕大部分功能,ES5均可以作到,新的class寫法只是讓對象原型的寫法更加清晰、更像面向對象編程的語法而已。
    //定義類
    class Point { 
      constructor(x,y) { 
          //構造方法
           this.x = x; //this關鍵字表明實例對象
           this.y = y; 
      } toString() {
           return '(' + this.x + ',' + this.y + ')'; 
      }
    }
  • 異步加載 JS 的方式有哪些?
    (1)defer,只支持 IE
    (2)async:
    (3)建立 script,插入到 DOM 中,加載完畢後 callBack
  • document.write 和 innerHTML 有何區別?
    document.write 只能重繪整個頁面innerHTML 能夠重繪頁面的一部分
  • DOM 操做——怎樣添加、移除、移動、複製、建立和查找節點?
    (1)建立新節點
      createDocumentFragment() //建立一個DOM片斷
      createElement() //建立一個具體的元素
      createTextNode() //建立一個文本節點
    (2)添加、移除、替換、插入
      appendChild()
      removeChild()
      replaceChild()
      insertBefore() //在已有的子節點前插入一個新的子節點
    (3)查找
      getElementsByTagName() //經過標籤名稱
      getElementsByName() //經過元素的Name屬性的值(IE容錯能力較強,會獲得一個數組,其中包括id等於name值的)
      getElementById() //經過元素Id,惟一性
    如何編寫高性能 JavaScript ?詳細文章:淺談編寫高性能的Javascript代碼
  • 哪些操做會形成內存泄漏?
    內存泄漏是指任何對象在您再也不擁有或須要它以後任然存在。
    垃圾回收器按期掃描對象,並計算引用了每一個對象的其餘對象的數量,若是一個對象的引用數量爲0(沒有其餘對象引用過該對象),或對該對象的唯一引用是循環的,那麼該對象的內存便可回收。
    //
    setTimeout 的第一個參數使用字符串而非函數的話,會引起內存泄漏。
    閉包、控制檯日誌、循環(在兩個對象彼此引用且彼此保留時,就會產生一個循環)
    jQuery 中如何將數組轉化爲 json 字符串,而後再轉化回來?
    jQuery 中沒有提供這個功能,因此須要先編寫兩個 jQuery 的擴展:
    $.fn.stringifyArray = function(array) {
       return JSON.stringify(array)
    }
    $.fn.parseArray = function(array) {
      return JSON.parse(array)
    }
    //而後調用:
    $("").stringifyArray(array)
  • jQuery.extend 與 jQuery.fn.extend 有何區別?
    jQuery.extend(object); //爲jQuery類添加類方法,能夠理解爲添加靜態方法
    jQuery.extend({
      min: function(a, b) { return a < b ? a : b; },
      max: function(a, b) { return a > b ? a : b; }
    });
    jQuery.min(2,3); //  2 
    jQuery.max(4,5); //  5
    jQuery.extend( target, object1, [objectN])用一個或多個其餘對象來擴展一個對象,返回被擴展的對象
    jQuery.fn.extend(object); //對jQuery.prototype進行的擴展,就是爲jQuery類添加「成員函數」。jQuery類的實例可使用這個「成員函數」。
    好比咱們要開發一個插件,作一個特殊的編輯框,當它被點擊時,便alert 當前編輯框裏的內容。能夠這麼作:
    $.fn.extend({          
       alertWhileClick:function() {            
             $(this).click(function(){                 
                    alert($(this).val());           
              });           
        }       
    });       
    $("#input1").alertWhileClick(); // 頁面上爲$("#input1")爲一個jQuery實例,當它調用成員方法 alertWhileClick後,便實現了擴展,每次被點擊時它會先彈出目前編輯裏的內容。
  • 是否瞭解針對 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++) {}
  • jQuery 與 jQuery UI 有何區別?
    jQuery是一個js庫,主要提供的功能是選擇器,屬性修改和事件綁定等等。
    jQuery UI則是在jQuery的基礎上,利用jQuery的擴展性,設計的插件。提供了一些經常使用的界面元素,諸如對話框、拖動行爲、改變大小行爲等等
  • 如何判斷當前腳本運行在瀏覽器仍是 node 環境中?(阿里)
    經過判斷 Global 對象是否爲 window ,若是不爲 window ,當前腳本沒有運行在瀏覽器中
  • 怎樣用js實現千位分隔符?
    正則 + replace
    function commafy(num) { 
       num = num + ''; 
       var reg = /(-?d+)(d{3})/; 
       if (reg.test(num)) { 
           num = num.replace(reg, '$1,$2');
       } 
      return num;
    }
  • 檢測瀏覽器版本有哪些方式?
    功能檢測、userAgent 特徵檢測
    好比:navigator.userAgent
    //"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36"
  • Canvas和SVG的比較;
    |                Canvas             |                SVG                 |
    | --------------------------------- | -----------------------------------|
    |        位圖技術,能夠保存爲.png      |      矢量圖技術,不能保存爲位圖
    | --------------------------------- | -----------------------------------|
    |        善於表現顏色和線條細節        |      能夠縮放,不善於表現細節
    | --------------------------------- | -----------------------------------|
    |        網頁遊戲,統計圖             |       圖標,統計圖,地圖              | 
    | --------------------------------- | -----------------------------------|
    |一個標籤(canvas)+一個對象(getcontext),                                    |                                     
    | 全部圖形圖像都靠ctx繪製              |   幾十個標籤---每一個圖形對應一個標籤    |
    | --------------------------------- | -----------------------------------|
    | 不能被搜索引擎爬蟲所訪問                        能夠
    | --------------------------------- | -----------------------------------|
    | 只能爲整個 Canvas綁定監聽函數        |    每一個圖形(標籤)能夠綁定事件監聽函數  |
    | --------------------------------- | -----------------------------------|
  • 談談你對 JavaScript 中的模塊規範 CommonJS、AMD、CMD 的瞭解?javascript

    //我的拙見
    | CommonJS |   AMD   | CMD     |
    |----------|---------|---------|
    | Node.js  |RequireJS| SeaJS   |

    詳細文章:淺析JS中的模塊規範(CommonJS,AMD,CMD)關於 CommonJS AMD CMD UMDhtml

  • 前端 MVC、MVVM
    一、MVC前端


     

    MVCjava

    模型(Model):數據保存
    視圖(View):用戶界面
    控制器(Controller):業務邏輯
    (1)View 傳送指令到 Controller
    (2)Controller 完成業務邏輯後,要求 Model 改變狀態
    (3)Model 將新的數據發送到 View ,用戶獲得反饋全部通訊都是單向的。

    二、MVVMnode


     

    MVVMgit

    模型(Model)
    視圖(View)
    視圖模型(ViewModel)
    (1)各部分間都是雙向通訊
    (2)View 與 Model 不發生聯繫,都經過 ViewModel 傳遞
    (3)View 很是薄,不部署任何業務邏輯,稱爲「被動視圖」(Passive View),即沒有任何主動性;而 ViewModel 很是厚,全部邏輯都部署在那裏。
    採用雙向綁定(data-binding):View 的變更,自動反映在 ViewModel ,反之亦然。
  • HTTP協議的狀態消息都有哪些?(如200、302對應的描述)國內外的JS牛人都知道哪些?
    協議是指計算機通訊網絡中兩臺計算機之間進行通訊所必須共同遵照的規定或規則,超文本傳輸協議(HTTP)是一種通訊協議,它容許將超文本標記語言(HTML)文檔從Web服務器傳送到客戶端的瀏覽器,
    • 「100″ : Continue(繼續) 初始的請求已經接受,客戶應當繼續發送請求的其他部分。(HTTP 1.1新)
    •  「101″ : Switching Protocols(切換協議) 請求者已要求服務器切換協議,服務器已確認並準備進行切換。(HTTP 1.1新)
    •  「200″ : OK(成功) 一切正常,對GET和POST請求的應答文檔跟在後面。
    •  「201″ : Created(已建立)服務器已經建立了文檔,Location頭給出了它的URL。
    •  「202″ : Accepted(已接受)服務器已接受了請求,但還沒有對其進行處理。
    •  「203″ : Non-Authoritative Information(非受權信息) 文檔已經正常地返回,但一些應答頭可能不正確,可能來自另外一來源 。(HTTP 1.1新)。
    •  「204″ : No Content(無內容)未返回任何內容,瀏覽器應該繼續顯示原來的文檔。
    •  「205″ : Reset Content(重置內容)沒有新的內容,但瀏覽器應該重置它所顯示的內容。用來強制瀏覽器清除表單輸入內容(HTTP 1.1新)。
    •  「206″ : Partial Content(部份內容)服務器成功處理了部分 GET 請求。(HTTP 1.1新)
    •  「300″ : Multiple Choices(多種選擇)客戶請求的文檔能夠在多個位置找到,這些位置已經在返回的文檔內列出。若是服務器要提出優先選擇,則應該在Location應答頭指明。
    •  「301″ : Moved Permanently(永久移動)請求的網頁已被永久移動到新位置。服務器返回此響應(做爲對 GET 或 HEAD 請求的響應)時,會自動將請求者轉到新位置。
    •  「302″ : Found(臨時移動)相似於301,但新的URL應該被視爲臨時性的替代,而不是永久性的。注意,在HTTP1.0中對應的狀態信息是「Moved Temporatily」,出現該狀態代碼時,瀏覽器可以自動訪問新的URL,所以它是一個頗有用的狀態代碼。注意這個狀態代碼有時候能夠和301替換使用。例如,若是瀏覽器錯誤地請求http://host/~user(缺乏了後面的斜槓),有的服務器返回301,有的則返回302。嚴格地說,咱們只能假定只有當原來的請求是GET時瀏覽器纔會自動重定向。請參見307。
    •  「303″ : See Other(查看其餘位置)相似於301/302,不一樣之處在於,若是原來的請求是POST,Location頭指定的重定向目標文檔應該經過GET提取(HTTP 1.1新)。
    •  「304″ : Not Modified(未修改)自從上次請求後,請求的網頁未被修改過。原來緩衝的文檔還能夠繼續使用,不會返回網頁內容。
    •  「305″ : Use Proxy(使用代理)只能使用代理訪問請求的網頁。若是服務器返回此響應,那麼,服務器還會指明請求者應當使用的代理。(HTTP 1.1新)
    •  「307″ : Temporary Redirect(臨時重定向)和 302(Found)相同。許多瀏覽器會錯誤地響應302應答進行重定向,即便原來的請求是POST,即便它實際上只能在POST請求的應答是303時才能重定向。因爲這個緣由,HTTP 1.1新增了307,以便更加清除地區分幾個狀態代碼:當出現303應答時,瀏覽器能夠跟隨重定向的GET和POST請求;若是是307應答,則瀏覽器只能跟隨對GET請求的重定向。(HTTP 1.1新)
    •  「400″ : Bad Request(錯誤請求)請求出現語法錯誤。
    •  「401″ : Unauthorized(未受權)客戶試圖未經受權訪問受密碼保護的頁面。應答中會包含一個WWW-Authenticate頭,瀏覽器據此顯示用戶名字/密碼對話框,而後在填寫合適的Authorization頭後再次發出請求。
    •  「403″ : Forbidden(已禁止) 資源不可用。服務器理解客戶的請求,但拒絕處理它。一般因爲服務器上文件或目錄的權限設置致使。
    •  「404″ : Not Found(未找到)沒法找到指定位置的資源。
    •  「405″ : Method Not Allowed(方法禁用)請求方法(GET、POST、HEAD、DELETE、PUT、TRACE等)禁用。(HTTP 1.1新)
    •  「406″ : Not Acceptable(不接受)指定的資源已經找到,但它的MIME類型和客戶在Accpet頭中所指定的不兼容(HTTP 1.1新)。
    •  「407″ : Proxy Authentication Required(須要代理受權)相似於401,表示客戶必須先通過代理服務器的受權。(HTTP 1.1新)
    •  「408″ : Request Time-out(請求超時)服務器等候請求時超時。(HTTP 1.1新)
    •  「409″ : Conflict(衝突)一般和PUT請求有關。因爲請求和資源的當前狀態相沖突,所以請求不能成功。(HTTP 1.1新)
    •  「410″ : Gone(已刪除)若是請求的資源已被永久刪除,那麼,服務器會返回此響應。該代碼與 404(未找到)代碼相似,但在資源之前有但如今已經不復存在的狀況下,有時會替代 404 代碼出現。若是資源已被永久刪除,那麼,您應當使用 301 代碼指定該資源的新位置。(HTTP 1.1新)
    •  「411″ : Length Required(須要有效長度)不會接受包含無效內容長度標頭字段的請求。(HTTP 1.1新)
    •  「412″ : Precondition Failed(未知足前提條件)服務器未知足請求者在請求中設置的其中一個前提條件。(HTTP 1.1新)
    •  「413″ : Request Entity Too Large(請求實體過大)請求實體過大,已超出服務器的處理能力。若是服務器認爲本身可以稍後再處理該請求,則應該提供一個Retry-After頭。(HTTP 1.1新)
    •  「414″ : Request-URI Too Large(請求的 URI 過長)請求的 URI(一般爲網址)過長,服務器沒法進行處理。
    •  「415″ : Unsupported Media Type(不支持的媒體類型)請求的格式不受請求頁面的支持。
    •  「416″ : Requested range not satisfiable(請求範圍不符合要求)服務器不能知足客戶在請求中指定的Range頭。(HTTP 1.1新)
    •  「417″ : Expectation Failed(未知足指望值)服務器未知足」指望」請求標頭字段的要求。
    •  「500″ : Internal Server Error(服務器內部錯誤)服務器遇到錯誤,沒法完成請求。
    •  「501″ : Not Implemented(還沒有實施) 服務器不具有完成請求的功能。例如,當服務器沒法識別請求方法時,服務器可能會返回此代碼。
    •  「502″ : Bad Gateway(錯誤網關)服務器做爲網關或者代理時,爲了完成請求訪問下一個服務器,但該服務器返回了非法的應答。
    •  「503″ : Service Unavailable(服務不可用)服務器因爲維護或者負載太重未能應答。一般,這只是一種暫時的狀態。
    •  「504″ : Gateway Time-out(網關超時) 由做爲代理或網關的服務器使用,表示不能及時地從遠程服務器得到應答。(HTTP 1.1新)
    •  「505″ : HTTP Version not supported(HTTP 版本不受支持)不支持請求中所使用的 HTTP 協議版本。
    國內的比較牛的人:淘寶網UED官方博客。靈玉,大成小胖,承玉,拔赤
相關文章
相關標籤/搜索