《前端面試江湖》讀書筆記

B_Cornelius發表於2017-12-04

看到有人說這本書漏洞百出,主要是我也沒認真看,一些簡單的我直接跳過的。下面這些內容也經過我認真上網搜了以下,能保證準確率。如果還有錯誤的地方請指出

本來很久以前就該把前端面試系列的文章更新完,但是自己懶,加上發現網上有些文章確實寫的不錯,就一直拖著沒寫。但是有次去圖書館,看到一本書叫《前端面試江湖》,索性找了一個時間,把全部內容整合到一起。這裡面肯定有你不瞭解的東西,那些東西能夠很大程度上提高你的開發效率。這本書2016年5月出的,卻還在講JQuery。所以有些地方我對其進行了補充

如何處理IE和Firefox如果處理事件相容性

獲取事件:

function et(e) {
    let event = window.event || e
}
複製程式碼

鍵盤值的獲取: Firfox下event.which和IE的event.keyCode相當

let key = event.keyCode || event.which
複製程式碼

事件源的獲取:

let target = event.srcElement || event.target
複製程式碼

事件監聽:

IE: element.attacthEvent('on' + eventName, function(){})
Firfox: element.addEventListener(eventName, handler, false)
複製程式碼

滑鼠位置: 在IE下,event物件有x、y屬性,在Firfox下,event有PageX, PageY屬性 所有獲取滑鼠位置時:

x = event.x || event.pageX
複製程式碼

阻止預設瀏覽器行為:

e.preventDefault() || event.returnValue = false
複製程式碼

阻止冒泡事件:

e.stopPropagation() || event.cancelBubble = true
複製程式碼

獲取下拉框中選中項的內容

<select id="test" name="">
    <option value="1">text 1</option>
    <option value="2">text 2</option>
</select>
複製程式碼

拿到選中項的索引:

let index = document.getElementById('test').selectedIndex.
複製程式碼

selectIndex表示選中項的index

在Form表單中get和post方式提交的區別

這個問題一直在爭論,我就覺得明明一句話解決的問題,非要弄得這麼複雜。這是書上的答案:
1、get是從伺服器上獲取資料,post是向伺服器提交資料
2、get是把引數資料提交到表單的action屬性所指的URL中,值和表單各個欄位一一對應。post是通過HTTP post機制,將表單內各個欄位和其內容放置在HTML HEADER內一起傳到action屬性所指的URL地址。
3、get傳送的資料不能大於2kb,post傳送的資料更大,但也有限制。
4、get安全效能非常低,post安全性較高
5、get限制Form表單的資料集的值必須為ASCII字元,而post支援整個ISO10646字符集。

AJAX的簡單實現

var xhr = new XMLHttpRequest()
xhr.onreadystatechange = function () {
	if (xhr.readyState == 4) {
		if ((xhr.status >= 200 && xhr.status < 300 || xhr.status == 304)) {
			alert(xhr.responseText)
		} else {
			alert('unsuccessful:' + xhr.status)
		}
	}
}
xhr.open('get', 'example.txt', true)
xhr.send(null)
複製程式碼

HTTP協議狀態碼

具體內容看看MDN,這裡就懶的寫了 1xx: 資訊 2xx: 成功 3xx:重定向 4xx:客戶端錯誤 5xx:伺服器錯誤

JavaScript如何得到HTTP的請求頭資訊和返回的資訊

getResponseHeader從響應資訊中返回指定的http資訊 getAllResonponseHeaders 獲取響應的所有HTTP頭資訊

JSONP的簡單實現

var Jsonp = document.createElement('script')
// Firfox: onload, IE: onreadyStatechange
Jsonp.onload = Jsonp.onreadyStatechange = function () {
    if (!this.readyState || this.readyState === 'loaded'
        || this.readyState === 'complete') {
        alert($('#demo').html())
        // 清理防止IE記憶體洩露
        Jsonp.onload = Jsonp.onreadyStatechange = null
    }
}
Jsonp.type = 'text/javascript'
Jsonp.src = 'http://www.xxx.com/JS/JQuery.js'
// 往header裡邊新增
document.getElementByTagName('head')[0].appendChild(Jsonp)
複製程式碼

HTML5和CSS3的瞭解

1、更多的描述性標籤
2、良好的媒體支援
3、更強大的Web應用
4、跨文件資訊通訊
5、Web Sockets
6、客戶端儲存
7、更加精美的頁面
8、更強大的表單
9、提升可訪問性
10、先進的選擇器
11、視覺效果

如何觸發頁面的reflow, repaint

除了頁面在首次載入時必然要經歷該過程之外,還有以下行為會觸發這個行為: 1、dom元素的新增、修改、刪除。(這就是為什麼避免dom元素的修改,因為reflow和repaint最耗效能)
2、僅修改DOM元素的字型顏色(只有repaint,因為不需要調整佈局)
3、應用新的樣式或者修改任何影響元素外觀的屬性
4、resize瀏覽器視窗,滾動頁面
5、讀取元素的某些屬性

localStorage物件的常用方法

儲存:localStorage.setItem(key, value) 獲取:localStorage.getItem(key) 刪除:localStorage.removeItem(key) 全部刪除:localStorage.clear()

cookie、sessionStorage和localStorage的區別

cookie資料始終在同源的HTTP請求中攜帶。而sessionStorage和localStorage不會自動把資料傳送給伺服器,僅在本地儲存。cookie資料還有路徑(path)的概念,可以限制cookie只屬於某個路徑下。

儲存大小限制不同,cookie資料不能超過4KB,同時因為每次HTTP請求都會攜帶cookie,所以cookie只適合儲存很小的資料。sessionStorage和localStorage也有儲存限制,但是要大的多

資料有效期不同: sessionStorage:僅在當前瀏覽器視窗關閉前有效。localStorage:始終有效,視窗或瀏覽器關閉也一直儲存。cookie:只要在設定的cookie過期時間之前一直有效 作用域不同:sessionStorage不在不同的瀏覽器視窗中共享(我們可以不可以通過使用sessionStorage實現跨域).localStorage在所有同源串列埠都是共享的。cookie在所有同源視窗都是共享的。

前端角度做好SEO

1、CSS Sprites: 通俗來講就是圖片合併,可以把網站中一些比較通用的小圖,合併到一張大圖上
2、啟用keep-alive屬性:Keep-Alive可以理解為長連線。啟用connection的Keep-Alive屬性之外,這個連線能保持一段時間,從而提高頁面載入的速度
3、啟用瀏覽器快取,可以用快取技術來提高頁面的載入速度
4、啟用GZIP壓縮

提高前端效能

1、用Web Storage替換cookie
2、使用css動畫代替JavaScript動畫
3、使用客戶端資料庫
4、使用JavaScript的新功能
5、使用硬體加速

如果瀏覽器沒有安裝網頁上所設定的文字,可以怎麼做

@font-face {font-family: name; src: url(url); sRules}
複製程式碼

sRules樣式表定義

談談對前端安全的理解,有什麼,怎麼防範

前端安全問題主要有XSS、CSRF攻擊
XSS:跨站指令碼攻擊
它允許使用者將惡意程式碼植入到提供給其他使用者使用的頁面中,可以簡單的理解為一種javascript程式碼注入。
XSS的防禦措施: 過濾轉義輸入輸出
避免使用eval、new Function等執行字串的方法,除非確定字串和使用者輸入無關
使用cookie的httpOnly屬性,加上了這個屬性的cookie欄位,js是無法進行讀寫的
使用innerHTML、document.write的時候,如果資料是使用者輸入的,那麼需要物件關鍵字元進行過濾與轉義
CSRF:跨站請求偽造
其實就是網站中的一些提交行為,被黑客利用,在你訪問黑客的網站的時候進行操作,會被操作到其他網站上
CSRF防禦措施:
檢測http referer是否是同域名
避免登入的session長時間儲存在客戶端中
關鍵請求使用驗證碼或者token機制 其他的一些攻擊方法還有HTTP劫持、介面操作劫持

實現繼承的方法

使用prototype的方法並不是很好,很容易出錯,建議使用ES6的class。但這裡不講,因為有些老專案沒用ES6,所以瞭解prototype還有有必要的 借用建構函式實現繼承:

function Parent1(){
    this.name = "parent1"
}
function Child1(){
    Parent1.call(this);
    this.type = "child1";
}
複製程式碼

借用原型鏈實現繼承:

function Parent2(){
    this.name = "parent2";
    this.play = [1,2,3];
}
function Child2(){
    this.type = "child2";
}
Child2.prototype = new Parent2();
複製程式碼

組合式繼承:

function Parent3(){
    this.name = "parent3";
    this.play = [1,2,3];
}
function Child3(){
    Parent3.call(this);
    this.type = "child3";
}
Child3.prototype = Object.create(Parent3.prototype);
Child3.prototype.constructor = Child3;
複製程式碼

建立物件的方法(摘自《高階程式設計》):

工廠模式:

function cratePerson (name, age, job) {
    var o = new Object(
    o.name = name 
    o.age = age 
    o.job = job 
    o.sayName = function () {
        alert(this.name)
    }
    return o 
}

var person1 = cratePerson('Greg', 27, 'Doctor')
複製程式碼

建構函式:

function Person (name, age, job) {
    this.name = name 
    this.age = age 
    this.job = job 
    this.sayName = function () {
        alert(this.name )
    }
}

var person1 = cratePerson('Greg', 27, 'Doctor')
複製程式碼

原型模式:

function Person () {
}

Person.prototype.name = 'Greg'
Person.prototype.age = 18
Person.prototype.job = 'Doctor'
Person.prototype.sayName = function () {
    alert(this.name)
}
var person1 = new Person()
person1.sayName()   // Greg
複製程式碼

本文只講了一些理論性的知識,很少涉及程式設計。程式設計的部分我決定使用leetcode習題的方式進行講解 o)因為這個不太好單獨寫一篇部落格來進行講解。請關注我的github瞭解實時的進度

相關文章