2016百度前端面試題

1 寫出javascript運行結果:javascript

for(var i=0; i<10; i++){} alert(i); 


解題:彈出10

2 Cookie、sessionStorage、localStorage的區別css

3 JSONP原理前端

  • 首先是利用script標籤的src屬性來實現跨域。
  • 經過將前端方法做爲參數傳遞到服務器端,而後由服務器端注入參數以後再返回,實現服務器端向客戶端通訊。
  • 因爲使用script標籤的src屬性,所以只支持get方法

 

一個簡單的jsonp實現,其實就是拼接url,而後將動態添加一個script元素到頭部。java

 

1. 設定一個script標籤
<script src="http://jsonp.js?callback=xxx"></script>
2. 服務器
$callback = !empty($_GET['callback'] ? $_GET['callback'] : 'callback');
echo $callback.'(.json_encode($data).)';

 

4 簡述css盒模型json

w3c盒模型 標準模式 padding+margin+content+border 總寬度/高度=width/height+padding+border+margin跨域

ie盒模型 怪異模式 總寬度/高度= width/height+margin瀏覽器

當設置爲box-sizing:border-box時,將採用怪異模式解析計算;安全

 

 

5 說說get和post請求的區別服務器

       GET使用URL或Cookie傳參,而POST將數據放在BODY中。session

       GET的URL會有長度上的限制,則POST的數據則能夠很是大。

       POST比GET安全,由於數據在地址欄上不可見。

       GET請求的參數會保存在瀏覽器的歷史記錄中

 

 

 

6 運行結果

var a = {n: 1} var b = a; a.x = a = {n: 2} console.log(a.x); console.log(b.x) 

1 { n : 2}
2 undefined

 

7 說說類的建立、繼承和閉包。

傳統的經過構造函數+ 原型,用構造函數定義類的屬性,用原型定義類的方法

/**
 * Person類:定義一我的,有個屬性name,和一個getName方法
 * @param {String} name
 */
function Person(name) {
  this.name = name; } Person.prototype.getName = function() {
  return this.name; }

  

ES6中有class關鍵字,不過是語法糖,實質上仍是經過構造函數+原型的方式

// 定義類 Person
class Person {

  constructor(name, age) {
    this.name = name;    this.age = age;
  }

  setName(name) {
        this.name = name;
  }

  getName() {
            return this.name;
  }

  toString() {
                return 'name: ' + this.name + ', age: ' + this.age;
  }
}

  

繼承

分爲屬性和方法的繼承

 

組合繼承:原型鏈繼承+構造函數繼承

  使用原型鏈實現對原型屬性和方法的繼承,而經過借用構造函數來實現對實例屬性的繼承。這樣,即經過在原型上定義方法實現了函數複用,又保證了每一個實例都有它本身的屬性。

function Parent(age){
  this.name = ['mike','jack','smith'];
  this.age = age;
}
Parent.prototype.run = function () {
  return this.name + ' are both' + this.age;
};

function Child(age){

  Parent.call(this,age);

}

Child.prototype = new Parent();

缺點:調用2次父類的構造函數

  

原型式繼承

  藉助原型並基於已有的對象建立新對象,同時還不用建立自定義類型。

function obj(o){
  function F(){}
  F.prototype = o;
  return new F();
}

  

寄生式繼承

  把原型式+工廠模式結合起來,目的是爲了封裝建立的過程

<script>
  function create(o){
    var f= obj(o);
    f.run = function () {
      return this.arr;//一樣,會共享引用
    };
  return f;
  }
</script>

  

寄生組合繼承

  經過借用構造函數來繼承屬性,經過原型鏈的混成方式來繼承方法。

  基本思路:沒必要爲了指定子類的原型而調用超類型的構造函數。本質上,使用寄生式繼承來繼承超類型的原型,而後再將結果指定給子類型的原型。

function object(o) {
    function F() {}
    F.prototype = o;
    return new F();
}

function inheritPrototype(subType, superType) {
    var prototype = object(superType.prototype);  //建立對象
    prototype.constructor = subType;              //加強對象
    subType.prototype = prototype;                //指定對象
}

  

 

 

8 是否有設計過通用的組件? 
請設計一個 Dialog(彈出層) / Suggestion(自動完成) / Slider(圖片輪播) 等組件,你會提供什麼接口?調用過程是怎樣的?可能會遇到什麼細節問題?

 

 

9 一個頁面從輸入 URL 到頁面加載完的過程當中都發生了什麼事情?越詳細越好(考察知識廣度)

  1. http客戶端發起請求,建立一個端口,默認是80

  2. 而後http服務器在端口監聽客戶端的發送請求

  3. 最後服務器向客戶端返回狀態和內容

  4. 瀏覽器根據接收到的內容進行解析

 

10 什麼是 「use strict」? 使用它的好處和壞處是什麼?

嚴格模式是ES5引入的,更好的將錯誤檢測引入代碼的方法。顧名思義,使得JS在更嚴格的條件下運行。

變量必須先聲明,再使用
function test(){
  "use strict";
  foo = 'bar';  // Error
}

不能對變量執行delete操做
var foo = "test";
function test(){}

delete foo; // Error
delete test; // Error

function test2(arg) {
    delete arg; // Error
}
對象的屬性名不能重複
{ foo: true, foo: false } // Error

禁用eval()

函數的arguments參數
setTimeout(function later(){
  // do stuff...
  setTimeout( later, 1000 );
}, 1000 );

禁用with(){}

不能修改arguments
不能在函數內定義arguments變量
不能使用arugment.caller和argument.callee。所以若是你要引用匿名函數,須要對匿名函數命名。
相關文章
相關標籤/搜索