web前端面試100題
1.一些開放性題目
1.自我介紹:除了基本個人資訊以外,面試官更想聽的是你與眾不同的地方和你的優勢。
2.專案介紹
3.如何看待前端開發?
4.平時是如何學習前端開發的?
5.未來三到五年的規劃是怎樣的?
position的值, relative和absolute分別是相對於誰進行定位的?
§ absolute :生成絕對定位的元素, 相對於最近一級的 定位不是 static 的父元素來進行定位。
§ fixed(老IE不支援)生成絕對定位的元素,通常相對於瀏覽器視窗或 frame 進行定位。
§ relative生成相對定位的元素,相對於其在普通流中的位置進行定位。
§ static預設值。沒有定位,元素出現在正常的流中
§ sticky生成粘性定位的元素,容器的位置根據正常文件流計算得出
如何解決跨域問題
JSONP:
原理是:動態插入script標籤,通過script標籤引入一個js檔案,這個js檔案載入成功後會執行我們在url引數中指定的函式,並且會把我們需要的json資料作為引數傳入。
由於同源策略的限制,XmlHttpRequest只允許請求當前源(域名、協議、埠)的資源,為了實現跨域請求,可以通過script標籤實現跨域請求,然後在服務端輸出JSON資料並執行回撥函式,從而解決了跨域的資料請求。
優點是相容性好,簡單易用,支援瀏覽器與伺服器雙向通訊。缺點是隻支援GET請求。
JSONP:json+padding
<script>
functioncreateJs(sUrl){
var oScript =document.createElement('script');
oScript.type = 'text/javascript';
oScript.src= sUrl;
document.getElementsByTagName('head')[0].appendChild(oScript);
}
createJs('jsonp.js');
box({
'name': 'test'
});
functionbox(json){
alert(json.name);
}
</script>
CORS:
伺服器端對於CORS的支援,主要就是通過設定Access-Control-Allow-Origin來進行的。如果瀏覽器檢測到相應的設定,就可以允許Ajax進行跨域的訪問。
通過修改document.domain來跨子域
將子域和主域的document.domain設為同一個主域.前提條件:這兩個域名必須屬於同一個基礎域名!而且所用的協議,埠都要一致,否則無法利用document.domain進行跨域
主域相同的使用document.domain
使用window.name來進行跨域
window物件有個name屬性,該屬性有個特徵:即在一個視窗(window)的生命週期內,視窗載入的所有的頁面都是共享一個window.name的,每個頁面對window.name都有讀寫的許可權,window.name是持久存在一個視窗載入過的所有頁面中的
使用HTML5中新引進的window.postMessage方法來跨域傳送資料
還有flash、在伺服器上設定代理頁面等跨域方式。個人認為window.name的方法既不復雜,也能相容到幾乎所有瀏覽器,這真是極好的一種跨域方法。
XML和JSON的區別?
(1).資料體積方面。
JSON相對於XML來講,資料的體積小,傳遞的速度更快些。
(2).資料互動方面。
JSON與JavaScript的互動更加方便,更容易解析處理,更好的資料互動。
(3).資料描述方面。
JSON對資料的描述性比XML較差。
(4).傳輸速度方面。
JSON的速度要遠遠快於XML。
談談你對webpack的看法
WebPack是一個模組打包工具,你可以使用WebPack管理你的模組依賴,並編繹輸出模組們所需的靜態檔案。它能夠很好地管理、打包Web開發中所用到的HTML、CSS以及各種靜態檔案(圖片、字型等),讓開發過程更加高效。對於不同型別的資源,webpack有對應的模組載入器。webpack模組打包器會分析模組間的依賴關係,最後 生成了優化且合併後的靜態資源。
webpack的兩大特色:
1.code splitting(可以自動完成)
2.loader 可以處理各種型別的靜態檔案,並且支援串聯操作
webpack是以commonJS的形式來書寫指令碼滴,但對 AMD/CMD的支援也很全面,方便舊專案進行程式碼遷移。
webpack具有requireJs和browserify的功能,但仍有很多自己的新特性:
1. 對 CommonJS 、 AMD、ES6的語法做了相容
2. 對js、css、圖片等資原始檔都支援打包
3. 串聯式模組載入器以及外掛機制,讓其具有更好的靈活性和擴充套件性,例如提供對CoffeeScript、ES6的支援
4. 有獨立的配置檔案webpack.config.js
5. 可以將程式碼切割成不同的chunk,實現按需載入,降低了初始化時間
6. 支援 SourceUrls 和SourceMaps,易於除錯
7. 具有強大的Plugin介面,大多是內部外掛,使用起來比較靈活
8.webpack 使用非同步 IO 並具有多級快取。這使得 webpack 很快且在增量編譯上更加快
說說TCP傳輸的三次握手四次揮手策略
為了準確無誤地把資料送達目標處,TCP協議採用了三次握手策略。用TCP協議把資料包送出去後,TCP不會對傳送 後的情況置之不理,它一定會向對方確認是否成功送達。握手過程中使用了TCP的標誌:SYN和ACK。
傳送端首先發送一個帶SYN標誌的資料包給對方。接收端收到後,回傳一個帶有SYN/ACK標誌的資料包以示傳達確認資訊。
最後,傳送端再回傳一個帶ACK標誌的資料包,代表“握手”結束。
若在握手過程中某個階段莫名中斷,TCP協議會再次以相同的順序傳送相同的資料包。
斷開一個TCP連線則需要“四次握手”:
§ 第一次揮手:主動關閉方傳送一個FIN,用來關閉主動方到被動關閉方的資料傳送,也就是主動關閉方告訴被動關閉方:我已經不 會再給你發資料了(當然,在fin包之前傳送出去的資料,如果沒有收到對應的ack確認報文,主動關閉方依然會重發這些資料),但是,此時主動關閉方還可 以接受資料。
§ 第二次揮手:被動關閉方收到FIN包後,傳送一個ACK給對方,確認序號為收到序號+1(與SYN相同,一個FIN佔用一個序號)。
§ 第三次揮手:被動關閉方傳送一個FIN,用來關閉被動關閉方到主動關閉方的資料傳送,也就是告訴主動關閉方,我的資料也傳送完了,不會再給你發資料了。
§ 第四次揮手:主動關閉方收到FIN後,傳送一個ACK給被動關閉方,確認序號為收到序號+1,至此,完成四次揮手。
TCP和UDP的區別
TCP(Transmission Control Protocol,傳輸控制協議)是基於連線的協議,也就是說,在正式收發資料前,必須和對方建立可靠的連線。一個TCP連線必須要經過三次“對話”才能建立起來
UDP(User Data Protocol,使用者資料報協議)是與TCP相對應的協議。它是面向非連線的協議,它不與對方建立連線,而是直接就把資料包傳送過去!
UDP適用於一次只傳送少量資料、對可靠性要求不高的應用環境。
說說你對作用域鏈的理解
作用域鏈的作用是保證執行環境裡有權訪問的變數和函式是有序的,作用域鏈的變數只能向上訪問,變數訪問到window物件即被終止,作用域鏈向下訪問變數是不被允許的。
建立ajax過程
(1)建立XMLHttpRequest物件,也就是建立一個非同步呼叫物件.
(2)建立一個新的HTTP請求,並指定該HTTP請求的方法、URL及驗證資訊.
(3)設定響應HTTP請求狀態變化的函式.
(4)傳送HTTP請求.
(5)獲取非同步呼叫返回的資料.
(6)使用JavaScript和DOM實現區域性重新整理.
漸進增強和優雅降級
漸進增強 :針對低版本瀏覽器進行構建頁面,保證最基本的功能,然後再針對高階瀏覽器進行效果、互動等改進和追加功能達到更好的使用者體驗。
優雅降級 :一開始就構建完整的功能,然後再針對低版本瀏覽器進行相容。
常見web安全及防護原理
sql注入原理
就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的SQL命令。
總的來說有以下幾點:
1.永遠不要信任使用者的輸入,要對使用者的輸入進行校驗,可以通過正則表示式,或限制長度,對單引號和雙"-"進行轉換等。
2.永遠不要使用動態拼裝SQL,可以使用引數化的SQL或者直接使用儲存過程進行資料查詢存取。
3.永遠不要使用管理員許可權的資料庫連線,為每個應用使用單獨的許可權有限的資料庫連線。
4.不要把機密資訊明文存放,請加密或者hash掉密碼和敏感的資訊。
XSS原理及防範
Xss(cross-site scripting)攻擊指的是攻擊者往Web頁面裡插入惡意 html標籤或者javascript程式碼。比如:攻擊者在論壇中放一個
看似安全的連結,騙取使用者點選後,竊取cookie中的使用者私密資訊;或者攻擊者在論壇中加一個惡意表單,
當用戶提交表單的時候,卻把資訊傳送到攻擊者的伺服器中,而不是使用者原本以為的信任站點。
XSS防範方法
首先程式碼裡對使用者輸入的地方和變數都需要仔細檢查長度和對”<”,”>”,”;”,”’”等字元做過濾;其次任何內容寫到頁面之前都必須加以encode,避免不小心把html tag弄出來。這一個層面做好,至少可以堵住超過一半的XSS攻擊。
首先,避免直接在cookie中洩露使用者隱私,例如email、密碼等等。
其次,通過使cookie和系統ip繫結來降低cookie洩露後的危險。這樣攻擊者得到的cookie沒有實際價值,不可能拿來重放。
如果網站不需要再瀏覽器端對cookie進行操作,可以在Set-Cookie末尾加上HttpOnly來防止javascript程式碼直接獲取cookie。
儘量採用POST而非GET提交表單
XSS與CSRF有什麼區別嗎?
XSS是獲取資訊,不需要提前知道其他使用者頁面的程式碼和資料包。CSRF是代替使用者完成指定的動作,需要知道其他使用者頁面的程式碼和資料包。
要完成一次CSRF攻擊,受害者必須依次完成兩個步驟:
登入受信任網站A,並在本地生成Cookie。
在不登出A的情況下,訪問危險網站B。
CSRF的防禦
§ 服務端的CSRF方式方法很多樣,但總的思想都是一致的,就是在客戶端頁面增加偽隨機數。
§ 通過驗證碼的方法
Web Worker 和webSocket
worker主執行緒:
1.通過 worker = new Worker( url ) 載入一個JS檔案來建立一個worker,同時返回一個worker例項。
2.通過worker.postMessage( data) 方法來向worker傳送資料。
3.繫結worker.onmessage方法來接收worker傳送過來的資料。
4.可以使用 worker.terminate() 來終止一個worker的執行。
WebSocket是Web應用程式的傳輸協議,它提供了雙向的,按序到達的資料流。他是一個Html5協議,WebSocket的連線是持久的,他通過在客戶端和伺服器之間保持雙工連線,伺服器的更新可以被及時推送給客戶端,而不需要客戶端以一定時間間隔去輪詢。
HTTP和HTTPS
HTTP協議通常承載於TCP協議之上,在HTTP和TCP之間新增一個安全協議層(SSL或TSL),這個時候,就成了我們常說的HTTPS。
預設HTTP的埠號為80,HTTPS的埠號為443。
為什麼HTTPS安全
因為網路請求需要中間有很多的伺服器路由器的轉發。中間的節點都可能篡改資訊,而如果使用HTTPS,金鑰在你和終點站才有。https之所以比http安全,是因為他利用ssl/tls協議傳輸。它包含證書,解除安裝,流量轉發,負載均衡,頁面適配,瀏覽器適配,refer傳遞等。保障了傳輸過程的安全性
對前端模組化的認識
AMD 是 RequireJS在推廣過程中對模組定義的規範化產出。
CMD 是 SeaJS在推廣過程中對模組定義的規範化產出。
AMD是提前執行,CMD是延遲執行。
AMD推薦的風格通過返回一個物件做為模組物件,CommonJS的風格通過對module.exports或exports的屬性賦值來達到暴露模組物件的目的。
CMD模組方式
define(function(require, exports,module) {
// 模組程式碼
});
Javascript垃圾回收方法
標記清除(mark and sweep)
這是JavaScript最常見的垃圾回收方式,當變數進入執行環境的時候,比如函式中宣告一個變數,垃圾回收器將其標記為“進入環境”,當變數離開環境的時候(函式執行結束)將其標記為“離開環境”。
垃圾回收器會在執行的時候給儲存在記憶體中的所有變數加上標記,然後去掉環境中的變數以及被環境中變數所引用的變數(閉包),在這些完成之後仍存在標記的就是要刪除的變量了
引用計數(reference counting)
在低版本IE中經常會出現記憶體洩露,很多時候就是因為其採用引用計數方式進行垃圾回收。引用計數的策略是跟蹤記錄每個值被使用的次數,當聲明瞭一個變數並將一個引用型別賦值給該變數的時候這個值的引用次數就加1,如果該變數的值變成了另外一個,則這個值得引用次數減1,當這個值的引用次數變為0的時 候,說明沒有變數在使用,這個值沒法被訪問了,因此可以將其佔用的空間回收,這樣垃圾回收器會在執行的時候清理掉引用次數為0的值佔用的空間。
在IE中雖然JavaScript物件通過標記清除的方式進行垃圾回收,但BOM與DOM物件卻是通過引用計數回收垃圾的,
也就是說只要涉及BOM及DOM就會出現迴圈引用問題。
你覺得前端工程的價值體現在哪
為簡化使用者使用提供技術支援(互動部分)
為多個瀏覽器相容性提供支援
為提高使用者瀏覽速度(瀏覽器效能)提供支援
為跨平臺或者其他基於webkit或其他渲染引擎的應用提供支援
為展示資料提供支援(資料介面)
談談效能優化問題
程式碼層面:避免使用css表示式,避免使用高階選擇器,通配選擇器。
快取利用:快取Ajax,使用CDN,使用外部js和css檔案以便快取,新增Expires頭,服務端配置Etag,減少DNS查詢等
請求數量:合併樣式和指令碼,使用css圖片精靈,初始首屏之外的圖片資源按需載入,靜態資源延遲載入。
請求頻寬:壓縮檔案,開啟GZIP,
程式碼層面的優化
用hash-table來優化查詢
少用全域性變數
用innerHTML代替DOM操作,減少DOM操作次數,優化javascript效能
用setTimeout來避免頁面失去響應
快取DOM節點查詢的結果
避免使用CSS Expression
避免全域性查詢
避免使用with(with會建立自己的作用域,會增加作用域鏈長度)
多個變數宣告合併
避免圖片和iFrame等的空Src。空Src會重新載入當前頁面,影響速度和效率
儘量避免寫在HTML標籤中寫Style屬性
移動端效能優化
儘量使用css3動畫,開啟硬體加速。
適當使用touch事件代替click事件。
避免使用css3漸變陰影效果。
可以用transform: translateZ(0)來開啟硬體加速。
不濫用Float。Float在渲染時計算量比較大,儘量減少使用
不濫用Web字型。Web字型需要下載,解析,重繪當前頁面,儘量減少使用。
合理使用requestAnimationFrame動畫代替setTimeout
CSS中的屬性(CSS3 transitions、CSS3 3D transforms、Opacity、Canvas、WebGL、Video)會觸發GPU渲染,請合理使用。過渡使用會引發手機過耗電增加
PC端的在移動端同樣適用
什麼是Etag?
當傳送一個伺服器請求時,瀏覽器首先會進行快取過期判斷。瀏覽器根據快取過期時間判斷快取檔案是否過期。
情景一:若沒有過期,則不向伺服器傳送請求,直接使用快取中的結果,此時我們在瀏覽器控制檯中可以看到 200 OK(from cache) ,此時的情況就是完全使用快取,瀏覽器和伺服器沒有任何互動的。
情景二:若已過期,則向伺服器傳送請求,此時請求中會帶上①中設定的檔案修改時間,和Etag
然後,進行資源更新判斷。伺服器根據瀏覽器傳過來的檔案修改時間,判斷自瀏覽器上一次請求之後,檔案是不是沒有被修改過;根據Etag,判斷檔案內容自上一次請求之後,有沒有發生變化
情形一:若兩種判斷的結論都是檔案沒有被修改過,則伺服器就不給瀏覽器發index.html的內容了,直接告訴它,檔案沒有被修改過,你用你那邊的快取吧—— 304 Not Modified,此時瀏覽器就會從本地快取中獲取index.html的內容。此時的情況叫協議快取,瀏覽器和伺服器之間有一次請求互動。
情形二:若修改時間和檔案內容判斷有任意一個沒有通過,則伺服器會受理此次請求,之後的操作同①
① 只有get請求會被快取,post請求不會
Expires和Cache-Control
Expires要求客戶端和服務端的時鐘嚴格同步。HTTP1.1引入Cache-Control來克服Expires頭的限制。如果max-age和Expires同時出現,則max-age有更高的優先順序。
Cache-Control:no-cache, private, max-age=0
ETag: abcde
Expires: Thu, 15 Apr 201420:00:00 GMT
Pragma: private
Last-Modified:$now //RFC1123 format
ETag應用:
Etag由伺服器端生成,客戶端通過If-Match或者說If-None-Match這個條件判斷請求來驗證資源是否修改。常見的是使用If-None-Match。請求一個檔案的流程可能如下:
====第一次請求===
1.客戶端發起 HTTP GET 請求一個檔案;
2.伺服器處理請求,返回檔案內容和一堆Header,當然包括Etag(例如"2e681a-6-5d044840")(假設伺服器支援Etag生成和已經開啟了Etag).狀態碼200
====第二次請求===
客戶端發起 HTTP GET 請求一個檔案,注意這個時候客戶端同時傳送一個If-None-Match頭,這個頭的內容就是第一次請求時伺服器返回的Etag:2e681a-6-5d0448402.伺服器判斷髮送過來的Etag和計算出來的Etag匹配,因此If-None-Match為False,不返回200,返回304,客戶端繼續使用本地快取;流程很簡單,問題是,如果伺服器又設定了Cache-Control:max-age和Expires呢,怎麼辦
答案是同時使用,也就是說在完全匹配If-Modified-Since和If-None-Match即檢查完修改時間和Etag之後,
伺服器才能返回304.(不要陷入到底使用誰的問題怪圈)
為什麼使用Etag請求頭?
Etag 主要為了解決 Last-Modified無法解決的一些問題。
棧和佇列的區別?
棧的插入和刪除操作都是在一端進行的,而佇列的操作卻是在兩端進行的。
佇列先進先出,棧先進後出。
棧只允許在表尾一端進行插入和刪除,而佇列只允許在表尾一端進行插入,在表頭一端進行刪除
棧和堆的區別?
棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。
堆區(heap) — 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由OS回收。
堆(資料結構):堆可以被看成是一棵樹,如:堆排序;
棧(資料結構):一種先進後出的資料結構。
快速 排序的思想並實現一個快排?
“快速排序”的思想很簡單,整個排序過程只需要三步:
(1)在資料集之中,找一個基準點
(2)建立兩個陣列,分別儲存左邊和右邊的陣列
(3)利用遞迴進行下次比較
<scripttype="text/javascript">
functionquickSort(arr){
if(arr.length<=1){
return arr;//如果陣列只有一個數,就直接返回;
}
var num = Math.floor(arr.length/2);//找到中間數的索引值,如果是浮點數,則向下取整
var numValue =arr.splice(num,1);//找到中間數的值
var left = [];
var right = [];
for(var i=0;i<arr.length;i++){
if(arr[i]<numValue){
left.push(arr[i]);//基準點的左邊的數傳到左邊陣列
}
else{
right.push(arr[i]);//基準點的右邊的數傳到右邊陣列
}
}
returnquickSort(left).concat([numValue],quickSort(right));//遞迴不斷重複比較
}
alert(quickSort([32,45,37,16,2,87]));//彈出“2,16,32,37,45,87”
</script>
你覺得jQuery或zepto原始碼有哪些寫的好的地方
(答案僅供參考)
原始碼封裝在一個匿名函式的自執行環境中,有助於防止變數的全域性汙染,然後通過傳入window物件引數,可以使window物件作為區域性變數使用,好處是當jquery中訪問window物件的時候,就不用將作用域鏈退回到頂層作用域了,從而可以更快的訪問window物件。同樣,傳入undefined引數,可以縮短查詢undefined時的作用域鏈。
(function( window, undefined ) {
//用一個函式域包起來,就是所謂的沙箱
//在這裡邊var定義的變數,屬於這個函式域內的區域性變數,避免汙染全域性
//把當前沙箱需要的外部變數通過函式引數引入進來
//只要保證引數對內提供的介面的一致性,你還可以隨意替換傳進來的這個引數
window.jQuery = window.$ = jQuery;
})( window );
jquery將一些原型屬性和方法封裝在了jquery.prototype中,為了縮短名稱,又賦值給了jquery.fn,這是很形象的寫法。
有一些陣列或物件的方法經常能使用到,jQuery將其儲存為區域性變數以提高訪問速度。
jquery實現的鏈式呼叫可以節約程式碼,所返回的都是同一個物件,可以提高程式碼效率。
ES6的瞭解
新增模板字串(為JavaScript提供了簡單的字串插值功能)、箭頭函式(操作符左邊為輸入的引數,而右邊則是進行的操作以及返回的值Inputs=>outputs。)、for-of(用來遍歷資料—例如陣列中的值。)arguments物件可被不定引數和預設引數完美代替。ES6將promise物件納入規範,提供了原生的Promise物件。增加了let和const命令,用來宣告變數。增加了塊級作用域。let命令實際上就增加了塊級作用域。ES6規定,var命令和function命令宣告的全域性變數,屬於全域性物件的屬性;let命令、const命令、class命令宣告的全域性變數,不屬於全域性物件的屬性。。還有就是引入module模組的概念
js繼承方式及其優缺點
原型鏈繼承的缺點
一是字面量重寫原型會中斷關係,使用引用型別的原型,並且子型別還無法給超型別傳遞引數。
借用建構函式(類式繼承)
借用建構函式雖然解決了剛才兩種問題,但沒有原型,則複用無從談起。所以我們需要原型鏈+借用建構函式的模式,這種模式稱為組合繼承
組合式繼承
組合式繼承是比較常用的一種繼承方法,其背後的思路是 使用原型鏈實現對原型屬性和方法的繼承,而通過借用建構函式來實現對例項屬性的繼承。這樣,既通過在原型上定義方法實現了函式複用,又保證每個例項都有它自己的屬性。
關於Http 2.0 你知道多少?
HTTP/2引入了“服務端推(server push)”的概念,它允許服務端在客戶端需要資料之前就主動地將資料傳送到客戶端快取中,從而提高效能。
HTTP/2提供更多的加密支援
HTTP/2使用多路技術,允許多個訊息在一個連線上同時交差。
它增加了頭壓縮(header compression),因此即使非常小的請求,其請求和響應的header都只會佔用很小比例的頻寬。
defer和async
defer並行載入js檔案,會按照頁面上script標籤的順序執行
async並行載入js檔案,下載完成立即執行,不會按照頁面上script標籤的順序執行
談談浮動和清除浮動
浮動的框可以向左或向右移動,直到他的外邊緣碰到包含框或另一個浮動框的邊框為止。由於浮動框不在文件的普通流中,所以文件的普通流的塊框表現得就像浮動框不存在一樣。浮動的塊框會漂浮在文件普通流的塊框上。
如何評價AngularJS和BackboneJS
backbone具有依賴性,依賴underscore.js。Backbone + Underscore + jQuery(or Zepto)就比一個多出了2 次HTTP請求.
Backbone的Model沒有與UI檢視資料繫結,而是需要在View中自行操作DOM來更新或讀取UI資料。AngularJS與此相反,Model直接與UI檢視繫結,Model與UI檢視的關係,通過directive封裝,AngularJS內建的通用directive,就能實現大部分操作了,也就是說,基本不必關心Model與UI檢視的關係,直接操作Model就行了,UI檢視自動更新。
AngularJS的directive,你輸入特定資料,他就能輸出相應UI檢視。是一個比較完善的前端MVW框架,包含模板,資料雙向繫結,路由,模組化,服務,依賴注入等所有功能,模板功能強大豐富,並且是宣告式的,自帶了豐富的 Angular 指令。
用過哪些設計模式?
工廠模式:
主要好處就是可以消除物件間的耦合,通過使用工程方法而不是new關鍵字。將所有例項化的程式碼集中在一個位置防止程式碼重複。
工廠模式解決了重複例項化的問題 ,但還有一個問題,那就是識別問題,因為根本無法搞清楚他們到底是哪個物件的例項。
function createObject(name,age,profession){//集中例項化的函式var obj = newObject();
obj.name =name;
obj.age = age;
obj.profession= profession;
obj.move =function () {
returnthis.name + ' at ' + this.age + ' engaged in ' + this.profession;
};
return obj;
}
var test1 = createObject('trigkit4',22,'programmer');//第一個例項var test2 =createObject('mike',25,'engineer');//第二個例項
建構函式模式
使用建構函式的方法 ,即解決了重複例項化的問題 ,又解決了物件識別的問題,該模式與工廠模式的不同之處在於:
1.建構函式方法沒有顯示的建立物件 (new Object());
2.直接將屬性和方法賦值給 this 物件;
3.沒有 renturn 語句。
說說你對閉包的理解
使用閉包主要是為了設計私有的方法和變數。閉包的優點是可以避免全域性變數的汙染,缺點是閉包會常駐記憶體,會增大記憶體使用量,使用不當很容易造成記憶體洩露。在js中,函式即閉包,只有函式才會產生作用域的概念
閉包有三個特性:
1.函式巢狀函式
2.函式內部可以引用外部的引數和變數
3.引數和變數不會被垃圾回收機制回收
請你談談Cookie的弊端
cookie雖然在持久儲存客戶端資料提供了方便,分擔了伺服器儲存的負擔,但還是有很多侷限性的。
第一:每個特定的域名下最多生成20個cookie
1.IE6或更低版本最多20個cookie
2.IE7和之後的版本最後可以有50個cookie。
3.Firefox最多50個cookie
4.chrome和Safari沒有做硬性限制
IE和Opera會清理近期最少使用的cookie,Firefox會隨機清理cooki