百度經典面試題整理(面試必備)

1. 
當你打開瀏覽器輸入在搜索框中輸入「HTML5」的,而後返回結果,在這個過程當中計算機與網絡發生了什麼?你有什麼建議?javascript

基於http協議,因爲是在地址欄中輸入的網址因此會經過http的get方式將地址發送到服務器,
服務器接收到信息後對這些信息進行驗證,若經過驗證,
服務器會獲取html靜態頁面信息並將這些信息返回給客戶端的瀏覽器,
瀏覽器對html文件進行解析將頁面顯示出來html

2前端

使用javascript實現,將文檔中className有「test」的td標籤背景色設爲黃色。java

3web

用javascript實現控制一個文本框的輸入字數限制,超出字數限制文本框飄紅顯示編程

4瀏覽器

使用Javascript打印出1-10000之間的全部素數。緩存

5性能優化

列舉至少5種前端性能優化的具體方法,簡要說明理由。服務器

1.  請減小HTTP請求 

3.  請減小對DOM的操做  

4.  使用JSON格式來進行數據交換  

高效使用HTML標籤和CSS樣式 

將CSS和JS放到外部文件中引用,CSS放頭,JS放尾 

精簡CSS和JS文件 

壓縮圖片和使用圖片Sprite技術 

SON是一種輕量級的數據交換格式,採用徹底獨立於語言的文本格式,是理想的數據交換格式。同時,JSON是 JavaScript原生格式,這意味着在 JavaScript 中處理 JSON數據不須要任何特殊的 API 或工具包。

  與XML序列化相比,JSON序列化後產生的數據通常要比XML序列化後數據體積小,因此在Facebook等知名網站中都採用了JSON做爲數據交換方式。

6

 試從域名解析原理的角度簡單分析,域名劫持是怎麼發生的?有什麼危害?

1、DNS 是啥?

     DNS 是洋文「Domain Name System」的縮寫,直譯過來就是「域名系統」。
     2、DNS 有啥用?
     我們天天打交道的這個互聯網,其底層的基石是「IP」。IP 是「Internet Protocol」的縮寫,中文就「互聯網協議」(光看名字就知道這玩意兒很重要)。我們平常用的那些互聯網軟件(瀏覽器、聊天工具、下載工具、等等)在工做時,必須依靠【IP地址】才能進行網絡數據傳輸。
「IP地址」是設計給軟件用滴——雖然軟件很容易處理,但對於人類而言,卻很難記憶。因而,後來又發明了 DNS。有了 DNS,人類就不須要記住長長的一串 IP地址,而只需記住「域名」(域名一般更短,也更具備可讀性,例如www.g.cn)。
好比你上網的時候,只需在地址欄輸入網站的「域名」,而不用輸入網站的「IP地址」。而後電腦系統會利用 DNS 來把「域名」翻譯成「IP地址」。這個翻譯的過程術語叫「域名解析/DNS解析」。
     3、域名的結構是咋樣滴?
     域名是按照「樹形結構」組織的。不懂得啥是「樹形結構」的同窗,能夠對照一下電腦硬盤上的目錄結構。域名的結構和目錄結構很相似,目錄結構是用「斜槓」做分隔符,而域名是用小數點做分隔符。二者的主要區別在於:目錄結構名稱的形式是從左到右(上級在左,下級在右),而域名是從右到左(上級在右,下級在左)。
以網易的域名爲例:
3g.163.com 的上級域名是 .163.com
163.com 的上級域名是 .com
這裏的 .com 就被稱爲頂級域名(Top-Level Domain,簡稱 TLD),跟 .com 相似的那些 .net .org .gov 也是頂級域名。還有那些以國家/地區的代碼命名的(好比 .cn .tw .hk .jp 等等)也是頂級域名。
     4、「域名解析」是咋實現滴?
     若是你曾經配置過電腦的網卡,應該記得上面除了有IP地址、掩碼等設置,還有一項設置是「DNS服務器/域名服務器」。這項設置就是用來幫助你的電腦進行域名解析的。你能夠把這個「DNS服務器」想象成114查號臺。每當電腦須要翻譯某個域名,就找這個域名服務器查詢,而後域名服務器會告訴你的電腦,要查詢的域名對應的IP地址是啥。
下面簡單說一下,你的電腦進行域名解析的過程。
爲了敘述方便,以網易爲例。當你在瀏覽器的地址欄中輸入 www.163.com,而後敲回車,這時候電腦軟件會進行以下一系列事情。
1. 首先根據輸入的網址,提取出域名(
2. 若是你在系統中配置了 Hosts 文件,那麼電腦會先查詢 Hosts 文件,看這個www.163.com 否已經在 Hosts 裏面有了對應的記錄。若是有,直接就能夠拿到該記錄中的 IP地址,過程就結束了。
3. 若是 Hosts 裏面沒有這個別名,那麼電腦會看你有沒有設置域名服務器(DNS 服務器)。若是你的系統沒有設置域名服務器,那電腦就沒轍了,瀏覽器直接會報錯,說網站的域名沒法解析。過程就結束了。
4. 若是你設置過「域名服務器」,那麼電腦會向這個域名服務器發送一個域名查詢(DNS query)的請求,而後等候域名服務器的迴應。
5. 若是域名服務器始終沒有迴應(好比域名服務器掛了,或域名服務器的IP填錯了,或請求被 攔截了),那麼電腦仍是沒轍(瀏覽器會報錯)。
6. 若是域名服務器迴應了,那麼你的電腦就能夠根據域名服務器的應答信息,獲得該域名的 IP地址。以後瀏覽器就會向這個 IP地址 對應的 Web 端口發送 HTTP 請求。
一般狀況下,電腦拿到的(DNS服務器)應答信息是正確的——也就是說,應答中的 IP地址 確實對應那個域名——這種狀況下,你的網絡軟件就能夠正常工做了。
可是在某些國家,例如CHAOXIAN,電腦拿到的 DNS 應答有多是【錯的】。爲啥會這樣捏,本文的後半部,俺會介紹一下「域名劫持」和「域名污染」。
     5、域名服務器如何知道這些信息?
     (一)域名的緩存
大夥兒平時使用的域名服務器,技術術語叫「遞歸域名服務器」。「遞歸服務器」是面向普通網友的。剛纔介紹「域名解析」的時候提到的服務器就是「遞歸服務器」。
「遞歸服務器」的內部一般會有一個 DNS記錄 的緩存——這個緩存是爲了提升查詢效率的。當某臺電腦向遞歸服務器發起域名查詢時,遞歸服務器首先看本身的緩存中有沒有該域名的記錄,若是有,直接就回復該記錄給查詢的電腦。
萬一對方想要查詢的域名沒找到,咋辦捏?這時候就要進行緩存的同步。
(二)緩存的同步
下面就拿網易的域名爲例,說說這種狀況的處理流程。
1. 對方查詢3g.163.com 這個域名,「遞歸服務器」發現本身的緩存中沒有
2. 「遞歸服務器」會先去找「根域名服務器」幫忙,「根服務器」會告訴「遞歸服務器」說:這個域名屬於 com 這個分支之下,你去找 com 這個域名的「權威服務器」,這個權威服務器的 IP地址 是 xxx。
3. 而後「遞歸服務器」根據拿到的這個 xxx地址,又去找「com 域名的權威服務器」。「com 域名的權威服務器」告訴它:你應該去找「163.com 域名的權威服務器」,這個權威服務器的 IP地址 是 yyy
4. 而後「遞歸服務器」又屁顛屁顛地去找「163.com 域名的權威服務器」。這時候「163.com 域名的權威服務器」纔會告訴它,3g.163.com 這個域名的 IP地址 究竟是多少。
大夥兒看到沒有?整個過程如同「踢皮球」,效率是很低的。因此俺前面提到,「遞歸域名服務器」必須得有一個緩存,以此來優化效率(不用每次查詢都來一次「踢皮球」)。
(三)同步的週期
說完了「域名的同步」,順便提一下「同步的週期」。
由於互聯網上的域名信息是有可能發生變化的。好比增長了某個新域名,註銷了某個舊域名,或者某個域名對應的 IP地址 變了。因此,「遞歸服務器」上保留的緩存中,每一條域名記錄都有一個生命週期(多是幾分鐘,也多是幾小時)。若是某條記錄的生命週期過了,就會被刪除,而後從新同步。
     6、啥是「域名劫持」?
     剛纔說了,域名服務器上都會保存一大堆的域名記錄(每條記錄包含「域名」和「IP地址」)。當收到域名查詢的時候,域名服務器會從這堆記錄中找到對方想要的,而後迴應給對方。
若是域名服務器上的某條記錄被【人爲修改】了(改爲錯的),那麼一旦要查詢這條記錄,獲得的就是錯誤的結果。這種狀況稱之爲「域名劫持」。
★誰有「域名劫持」的企圖?
「域名劫持」一般是電信運營商(ISP)乾的好事兒。不少寬帶用戶用的域名服務器就是 ISP 提供給你的。
舉例:
前幾年曾經出現過:某個 ISP 跟某網站勾結,把維基百科的流量重定向到XX。具體搞法是:該 ISP 篡改本身的域名服務器的記錄,把裏面跟維基百科 相關的域名記錄的 IP地址 修改成XX的 IP地址。如此一來,假設你用的是這個 ISP 的域名服務器,當你在瀏覽器輸入 http://zh.wikipedia.org/的時候,你的電腦查詢到的 IP地址 實際上是XX的 IP地址,因此瀏覽器打開的是「XX」的主頁。
★如何對付「域名劫持」?
剛纔說了,「域名劫持」的根源在於:域名服務器上的記錄被人給改了。要對付這種耍流氓,最直接的辦法就是不要使用這種流氓 ISP 提供的域名服務器,改用國外那些比較靠譜的。目前口碑最好的,大概是 Google 提供的兩個域名服務器,IP地址 分別是 8.8.8.8 和 8.8.4.4 ——這倆不光是地址好記,更重要的是,不會耍流氓。

     7、啥是「域名污染」?
     先提醒一下:「域名污染」這個詞還有其它幾個別名,分別是「域名欺騙」、「域名緩存投毒」(洋文叫:DNS cache poisoning)。從此看到這幾個別名,要曉得是同一個意思。
「域名污染」的原理,簡單說來是這樣滴:當你的電腦向域名服務器發送了「域名查詢」的請求,而後域名服務器把迴應發送給你的電腦,這之間是有一個時間差的。若是某個攻擊者可以在域名服務器的「DNS應答」尚未到達你的電腦以前,先僞造一個錯誤的「DNS應答」發給你電腦。那麼你的電腦收到的就是錯誤的信息,並獲得一個錯誤的 IP地址。

★誰有「域名污染」的企圖?
從技術上講,只要攻擊者可以位於「你」和「域名服務器」的傳輸線路中間,那麼攻擊者就有機會搞「域名污染」。可以作到這點的,多是一個黑客/駭客,也多是 ISP。
★某國家防火牆的兩種「域名污染」
剛纔俺解釋了「域名污染」的原理,那種形式不妨稱爲「直接污染」。因爲某國家防火牆的特殊性,它不但能夠作到「直接污染」,還能夠作到「間接污染」。而普通的駭客頂多只能作到「直接污染」,難以作到「大範圍的間接污染」。
那麼這兩種污染有啥區別捏?且聽俺細細道來。
◇某國家防火牆部署在哪?
首先有必要先掃盲一下「某國家防火牆(實際上是一種IDS,也就是入侵檢測系統)的部署位置」。X國互聯網只有少數幾個國際出口(名氣較大的是:A出口、B出口、C出口)。若是你要訪問國外網站,你的網絡數據流就一定會通過其中的某個「國際出口」。
◇某國家防火牆的直接污染
由於某國家防火牆部署在國際出口。若是你用的是【國外的】域名服務器,你的「DNS請求」一定會通過國際出口;一樣,域名服務器的「DNS應答」一定也會通過國際出口才能到你的電腦。這一來一回就給某國家防火牆 提供了機會。
這種污染就是俺所說的「直接污染」。
◇某國家防火牆 的間接污染
剛纔介紹了「使用國外域名服務器會被直接污染」。那若是你用的是【國內的】域名服務器捏?就會被「間接污染」。過程以下:
1. 比方說你用的是某運營商的 DNS服務器,而後你想要訪問某個被不受歡迎的網站。
2. 對於不受歡迎的網站,其網站服務器一定在國外,並且網站的域名確定也不會使用 CN 之下的域名。因此,被封鎖的網站,其上級域名的「權威域名服務器」確定也是在國外。
3. 當你向「某運營商的DNS服務器」查詢不受歡迎的網站的域名,這臺「某運營商DNS服務器」就會去找這個不受歡迎的網站的上一級域名對應的「權威域名服務器」去進行「域名查詢」。
4. 由於是從國外進行域名查詢,相關的數據流一定要通過國際出口。一旦通過國際出口,就會被 某國家防火牆 污染。
5. 如此一來,「某運營商的域名服務器」拿到的是已經被污染的域名記錄(裏面的IP是錯的)。並且「某運營商的域名服務器」會把這條錯誤的記錄保存在本身的域名緩存中。
6. 下次若是有另外一個網友也找這臺「某運營商的域名服務」查詢這個不受歡迎的網站,也會查到錯誤的結果。
上述過程不斷重複,最終會致使:全國全部的域名服務器,它們的緩存中只要是包含了不受歡迎的網站的記錄,記錄中的 IP地址 一定是錯的(這個錯誤的 IP地址 也就是 某國家防火牆 僞造的那個)。因此說「間接污染」是很牛逼的,能夠把錯誤的域名記錄擴散到全國。
剛纔俺說了,「域名污染」也叫「域名緩存投毒」。「投毒」一詞真的很是形象——就好象在某條河流的源頭下毒,從而把整條河流的水都污染。「域名污染」直接破壞了互聯網的基礎設施。

7

請簡述javascript延遲加載的方式。 

延時加載又叫懶加載

主要目的是做爲服務器前端的優化,減小請求數或延遲請求數,一些圖片很是多的網站中很是有用,在瀏覽器可視區域外的圖片不會被載入,直到用戶將頁面滾動到它們所在的位置才加載,這樣對於含有不少 圖片的比較長的網頁來講,能夠加載的更快,而且還能節省服務器帶寬。,實現方式: 
1.第一種是純粹的延遲加載,使用setTimeOut或setInterval進行加載延遲.
2.第二種是條件加載,符合某些條件,或觸發了某些事件纔開始異步下載。
3.jQuery插件中也有插件來實現該功能。
4.第三種是可視區加載,即僅加載用戶能夠看到的區域,這個主要由監控滾動條來實現,通常會在距用戶看到某圖片前必定距離遍開始加載,這樣能保證用戶拉下時正好能看到圖片。

8

請簡述CSS加載方式link和@import的區別

二者都是外部引用CSS的方式,可是存在必定的區別:

區別1:link是XHTML標籤,除了加載CSS外,還能夠定義RSS等其餘事務;@import屬於CSS範疇,只能加載CSS。

區別2:link引用CSS時,在頁面載入時同時加載;@import須要頁面網頁徹底載入之後加載。

區別3:link是XHTML標籤,無兼容問題;@import是在CSS2.1提出的,低版本的瀏覽器不支持。

區別4:ink支持使用Javascript控制DOM去改變樣式;而@import不支持。

9

請簡述各瀏覽器的兼容問題

10

說出你對JS面向對象編程的理解,而後寫一斷示例

在基於類的面向對象方式中,對象(object依靠 類(class來產生。而在基於原型的面向對象方式中,對象(object則是依靠 構造器(constructor利用 原型(prototype構造出來的。

基於類的面向對象和基於原型的面向對象方式比較

在基於類的面向對象方式中,對象(object依靠 類(class來產生。而在基於原型的面向對象方式中,對象(object則是依靠 構造器(constructor利用 原型(prototype構造出來的。舉個客觀世界的例子來講明二種方式認知的差別。例如工廠造一輛車,一方面,工人必須參照一張工程圖紙,設計規定這輛車應該如何製造。這裏的工程圖紙就比如是語言中的 類 (class),而車就是按照這個 類(class製造出來的;另外一方面,工人和機器 ( 至關於 constructor) 利用各類零部件如發動機,輪胎,方向盤 ( 至關於 prototype 的各個屬性 ) 將汽車構造出來。

事實上關於這兩種方式誰更爲完全地表達了面向對象的思想,目前尚有爭論。但筆者認爲原型式面向對象是一種更爲完全的面向對象方式,理由以下:

首先,客觀世界中的對象的產生都是其它實物對象構造的結果,而抽象的「圖紙」是不能產生「汽車」的,也就是說,類是一個抽象概念而並不是實體,而對象的產生是一個實體的產生;

其次,按照一切事物皆對象這個最基本的面向對象的法則來看,類 (class) 自己並非一個對象,然而原型方式中的構造器 (constructor) 和原型 (prototype) 自己也是其餘對象經過原型方式構造出來的對象。

再次,在類式面嚮對象語言中,對象的狀態 (state) 由對象實例 (instance) 所持有,對象的行爲方法 (method) 則由聲明該對象的類所持有,而且只有對象的結構和方法可以被繼承;而在原型式面嚮對象語言中,對象的行爲、狀態都屬於對象自己,而且可以一塊兒被繼承(參考資源),這也更貼近客觀實際。

最後,類式面嚮對象語言好比 Java,爲了彌補沒法使用面向過程語言中全局函數和變量的不便,容許在類中聲明靜態 (static) 屬性和靜態方法。而實際上,客觀世界不存在所謂靜態概念,由於一切事物皆對象!而在原型式面嚮對象語言中,除內建對象 (build-in object) 外,不容許全局對象、方法或者屬性的存在,也沒有靜態概念。全部語言元素 (primitive) 必須依賴對象存在。但因爲函數式語言的特色,語言元素所依賴的對象是隨着運行時 (runtime) 上下文 (context) 變化而變化的,具體體如今 this 指針的變化。正是這種特色更貼近 「萬物皆有所屬,宇宙乃萬物生存之根本」的天然觀點。在 程序清單 1中 window 便相似與宇宙的概念。

相關文章
相關標籤/搜索