年輕人你不講武德,耗子尾汁~~~

總結就是為了形成自己的js知識網,提升自己,加油!
開始干
1、介紹js的基本資料型別
答: Undefined、Null、Boolean、Number、String
2、js有哪些內置物件?
答:資料封裝類物件:Object、Array、Boolean、Number 和 String
其他物件:Function、Arguments、Math、Date、RegExp、Error
3、this物件的理解
答:this總是指向函式的直接呼叫者(而非間接呼叫者);
如果有new關鍵字,this指向new出來的那個物件;
在事件中,this指向觸發這個事件的物件,特殊的是,IE中的attachEvent中的this總是指向全域物件Window,
可以看看我前面的文章 this在不同情況下的指向
4、eval是做什么的?
答:它的功能是把對應的字串決議成JS代碼并運行;
應該避免使用eval,不安全,非常耗性能(2次,一次決議成js陳述句,一次執行),
由JSON字串轉換為JSON物件的時候可以用eval,var obj =eval(’(’+ str +’)’),
5、DOM怎樣添加、移除、移動、復制、創建和查找節點
答:// 創建新節點
createDocumentFragment() //創建一個DOM片段
createElement() //創建一個具體的元素
createTextNode() //創建一個文本節點
// 添加、移除、替換、插入
appendChild()
removeChild()
replaceChild()
insertBefore() //在已有的子節點前插入一個新的子節點
// 查找
getElementsByTagName() //通過標簽名稱
getElementsByName() //通過元素的Name屬性的值(IE容錯能力較強,會得到一個陣列,其中包括id等于name值的)
getElementById() //通過元素Id,唯一性
6、null和undefined的區別?
答:null是一個表示"無"的物件,轉為數值時為0;undefined是一個表示"無"的原始值,轉為數值時為NaN,
undefined:
(1)變數被宣告了,但沒有賦值時,就等于undefined,
(2) 呼叫函式時,應該提供的引數沒有提供,該引數等于undefined,
(3)物件沒有賦值的屬性,該屬性的值為undefined,
(4)函式沒有回傳值時,默認回傳undefined,
null:
(1) 作為函式的引數,表示該函式的引數不是物件,
(2) 作為物件原型鏈的終點,
7、new運算子具體干了什么呢?
答:
(1)創建一個空物件,并且 this 變數參考該物件,同時還繼承了該函式的原型,
(2)屬性和方法被加入到 this 參考的物件中,
(3)新創建的物件由 this 所參考,并且最后隱式的回傳 this ,
8、JSON 的了解?
答:
JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式,它是基于JavaScript的一個子集,資料格式簡單, 易于讀寫, 占用帶寬小,
格式:采用鍵值對,例如:{“age”:“12”, “name”:“back”}
9、call() 和 apply() 的區別和作用?
答:
apply()函式有兩個引數:第一個引數是背景關系,第二個引數是引陣列成的陣列,如果背景關系是null,則使用全域物件代替,
如:function.apply(this,[1,2,3]);
call()的第一個引數是背景關系,后續是實體傳入的引數序列,
如:function.call(this,1,2,3);
10、如何獲取UA?
答:
function whatBrowser() {
document.Browser.Name.value=navigator.appName;
document.Browser.Version.value=navigator.appVersion;
document.Browser.Code.value=navigator.appCodeName;
document.Browser.Agent.value=navigator.userAgent;
}
11、哪些常見操作會造成記憶體泄漏?
答:
記憶體泄漏指任何物件在您不再擁有或需要它之后仍然存在,
垃圾回收器定期掃描物件,并計算參考了每個物件的其他物件的數量,如果一個物件的參考數量為 0(沒有其他物件參考過該物件),或對該物件的惟一參考是回圈的,那么該物件的記憶體即可回收,
setTimeout 的第一個引數使用字串而非函式的話,會引發記憶體泄漏,
閉包、控制臺日志、回圈(在兩個物件彼此參考且彼此保留時,就會產生一個回圈),
12、執行緒與行程的區別
答:
一個程式至少有一個行程,一個行程至少有一個執行緒,
執行緒的劃分尺度小于行程,使得多執行緒程式的并發性高,
另外,行程在執行程序中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的運行效率,
執行緒在執行程序中與行程還是有區別的,每個獨立的執行緒有一個程式運行的入口、順序執行序列和程式的出口,但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制,
從邏輯角度來看,多執行緒的意義在于一個應用程式中,有多個執行部分可以同時執行,但作業系統并沒有將多個執行緒看做多個獨立的應用,來實作行程的調度和管理以及資源分配,這就是行程和執行緒的重要區別,
13、如何解決跨域問題
JSONP:
原理是:動態插入script標簽,通過script標簽引入一個js檔案,這個js檔案載入成功后會執行我們在url引數中指定的函式,并且會把我們需要的json資料作為引數傳入,
由于同源策略的限制,XmlHttpRequest只允許請求當前源(域名、協議、埠)的資源,為了實作跨域請求,可以通過script標簽實作跨域請求,然后在服務端輸出JSON資料并執行回呼函式,從而解決了跨域的資料請求,
優點是兼容性好,簡單易用,支持瀏覽器與服務器雙向通信,缺點是只支持GET請求,
JSONP:json+padding(內填充),顧名思義,就是把JSON填充到一個盒子里
<script>
function createJs(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'
});
function box(json){
alert(json.name);
}
</script>
14、javascript垃圾回收方法
- 標記清除(mark and sweep)
這是JavaScript最常見的垃圾回收方式,當變數進入執行環境的時候,比如函式中宣告一個變數,垃圾回收器將其標記為“進入環境”,當變數離開環境的時候(函式執行結束)將其標記為“離開環境”,
垃圾回收器會在運行的時候給存盤在記憶體中的所有變數加上標記,然后去掉環境中的變數以及被環境中變數所參考的變數(閉包),在這些完成之后仍存在標記的就是要洗掉的變數了 - 參考計數(reference counting)
在低版本IE中經常會出現記憶體泄露,很多時候就是因為其采用參考計數方式進行垃圾回收,參考計數的策略是跟蹤記錄每個值被使用的次數,當宣告了一個變數并將一個參考型別賦值給該變數的時候這個值的參考次數就加1,如果該變數的值變成了另外一個,則這個值得參考次數減1,當這個值的參考次數變為0的時候,說明沒有變數在使用,這個值沒法被訪問了,因此可以將其占用的空間回收,這樣垃圾回收器會在運行的時候清理掉參考次數為0的值占用的空間,
在IE中雖然JavaScript物件通過標記清除的方式進行垃圾回收,但BOM與DOM物件卻是通過參考計數回收垃圾的,也就是說只要涉及BOM及DOM就會出現回圈參考問題,
15、快速 排序的思想并實作一個快排?
“快速排序”的思想很簡單,整個排序程序只需要三步:
(1)在資料集之中,找一個基準點
(2)建立兩個陣列,分別存盤左邊和右邊的陣列
(3)利用遞回進行下次比較
<script type="text/javascript">
function quickSort(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]);//基準點的右邊的數傳到右邊陣列
}
}
return quickSort(left).concat([numValue],quickSort(right));//遞回不斷重復比較
}
alert(quickSort([32,45,37,16,2,87]));//彈出“2,16,32,37,45,87”
</script>
16、ES6的了解
新增模板字串(為JavaScript提供了簡單的字串插值功能)、箭頭函式(運算子左邊為輸入的引數,而右邊則是進行的操作以及回傳的值Inputs=>outputs,)、for-of(用來遍歷資料—例如陣列中的值,)arguments物件可被不定引數和默認引數完美代替,ES6將promise物件納入規范,提供了原生的Promise物件,增加了let和const命令,用來宣告變數,增加了塊級作用域,let命令實際上就增加了塊級作用域,ES6規定,var命令和function命令宣告的全域變數,屬于全域物件的屬性;let命令、const命令、class命令宣告的全域變數,不屬于全域物件的屬性,,還有就是引入module模塊的概念,
17、用過哪些設計模式?
(1)工廠模式:
主要好處就是可以消除物件間的耦合,通過使用工程方法而不是new關鍵字,將所有實體化的代碼集中在一個位置防止代碼重復,
(2)工廠模式解決了重復實體化的問題 ,但還有一個問題,那就是識別問題,因為根本無法 搞清楚他們到底是哪個物件的實體,
function createObject(name,age,profession){//集中實體化的函式var obj = new Object();
obj.name = name;
obj.age = age;
obj.profession = profession;
obj.move = function () {
return this.name + ' at ' + this.age + ' engaged in ' + this.profession;
};
return obj;
}
var test1 = createObject('trigkit4',22,'programmer');//第一個實體var test2 = createObject('mike',25,'engineer');//第二個實體
(3)建構式模式
使用建構式的方法 ,即解決了重復實體化的問題 ,又解決了物件識別的問題,該模式與工廠模式的不同之處在于:
建構式方法沒有顯示的創建物件 (new Object());
直接將屬性和方法賦值給 this 物件;
沒有 renturn 陳述句,
(4)原型鏈模式
(5)構造和原型鏈的組合模式
18、說說你對閉包的理解
使用閉包主要是為了設計私有的方法和變數,閉包的優點是可以避免全域變數的污染,缺點是閉包會常駐記憶體,會增大記憶體使用量,使用不當很容易造成記憶體泄露,在js中,函式即閉包,只有函式才會產生作用域的概念
閉包有三個特性:
(1)函式嵌套函式
(2)函式內部可以參考外部的引數和變數
(3)引數和變數不會被垃圾回識訓制回收
19、請你談談Cookie的弊端
cookie雖然在持久保存客戶端資料提供了方便,分擔了服務器存盤的負擔,但還是有很多局限性的,
第一:每個特定的域名下最多生成20個cookie
(1)IE6或更低版本最多20個cookie
(2)IE7和之后的版本最后可以有50個cookie,
(3)Firefox最多50個cookie
(4)chrome和Safari沒有做硬性限制
IE和Opera 會清理近期最少使用的cookie,Firefox會隨機清理cookie,
cookie的最大大約為4096位元組,為了兼容性,一般不能超過4095位元組,
IE 提供了一種存盤可以持久化用戶資料,叫做userdata,從IE5.0就開始支持,每個資料最多128K,每個域名下最多1M,這個持久化資料放在快取中,如果快取沒有清理,那么會一直存在,
優點:極高的擴展性和可用性
通過良好的編程,控制保存在cookie中的session物件的大小,
通過加密和安全傳輸技術(SSL),減少cookie被破解的可能性,
只在cookie中存放不敏感資料,即使被盜也不會有重大損失,
控制cookie的生命期,使之不會永遠有效,偷盜者很可能拿到一個過期的cookie,
缺點:
Cookie數量和長度的限制,每個domain最多只能有20條cookie,每個cookie長度不能超過4KB,否則會被截掉.
安全性問題,如果cookie被人攔截了,那人就可以取得所有的session資訊,即使加密也與事無補,因為攔截者并不需要知道cookie的意義,他只要原樣轉發cookie就可以達到目的了,
有些狀態不可能保存在客戶端,例如,為了防止重復提交表單,我們需要在服務器端保存一個計數器,如果我們把這個計數器保存在客戶端,那么它起不到任何作用,
20、瀏覽器本地存盤
在較高版本的瀏覽器中,js提供了sessionStorage和globalStorage,在HTML5中提供了localStorage來取代globalStorage,
html5中的Web Storage包括了兩種存盤方式:sessionStorage和localStorage,
sessionStorage用于本地存盤一個會話(session)中的資料,這些資料只有在同一個會話中的頁面才能訪問并且當會話結束后資料也隨之銷毀,因此sessionStorage不是一種持久化的本地存盤,僅僅是會話級別的存盤,
而localStorage用于持久化的本地存盤,除非主動洗掉資料,否則資料是永遠不會過期的,
web storage和cookie的區別
Web Storage的概念和cookie相似,區別是它是為了更大容量存盤設計的,Cookie的大小是受限的,并且每次你請求一個新的頁面的時候Cookie都會被發送過去,這樣無形中浪費了帶寬,另外cookie還需要指定作用域,不可以跨域呼叫,
除此之外,Web Storage擁有setItem,getItem,removeItem,clear等方法,不像cookie需要前端開發者自己封裝setCookie,getCookie,
但是cookie也是不可以或缺的:cookie的作用是與服務器進行互動,作為HTTP規范的一部分而存在 ,而Web Storage僅僅是為了在本地“存盤”資料而生
瀏覽器的支持除了IE7及以下不支持外,其他標準瀏覽器都完全支持(ie及FF需在web服務器里運行),值得一提的是IE總是辦好事,例如IE7、IE6中的userData其實就是javascript本地存盤的解決方案,通過簡單的代碼封裝可以統一到所有的瀏覽器都支持web storage,
localStorage和sessionStorage都具有相同的操作方法,例如setItem、getItem和removeItem等
21、cookie 和session 的區別:
(1)cookie資料存放在客戶的瀏覽器上,session資料放在服務器上,
(2)cookie不是很安全,別人可以分析存放在本地的COOKIE并進行COOKIE欺騙考慮到安全應當使用session,
(3)session會在一定時間內保存在服務器上,當訪問增多,會比較占用你服務器的性能
考慮到減輕服務器性能方面,應當使用COOKIE,
(4)單個cookie保存的資料不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie,
(5)所以個人建議:
將登陸資訊等重要資訊存放為SESSION
其他資訊如果需要保留,可以放在COOKIE中
22、如何實作瀏覽器內多個標簽頁之間的通信?
呼叫localstorge、cookies等本地存盤方式
23、js延遲加載的方式有哪些?
defer和async、動態創建DOM方式(創建script,插入到DOM中,加載完畢后callBack)、按需異步載入js,
24、列舉IE 與其他瀏覽器不一樣的特性?
(1)IE支持currentStyle,FIrefox使用getComputStyle
(2)IE 使用innerText,Firefox使用textContent
(3)濾鏡方面:IE:filter:alpha(opacity= num);Firefox:-moz-opacity:num
(4)事件方面:IE:attachEvent:火狐是addEventListener
(5)滑鼠位置:IE是event.clientX;火狐是event.pageX
(6)IE使用event.srcElement;Firefox使用event.target
(7)IE中消除list的原點僅需margin:0即可達到最終效果;FIrefox需要設定margin:0;padding:0以及list-style:none
(8)CSS圓角:ie7以下不支持圓角
25、javascript物件的幾種創建方式
(1)工廠模式
(2)建構式模式
(3)原型模式
(4)混合建構式和原型模式
(5)動態原型模式
(6)寄生建構式模式
(7)穩妥建構式模式
后續還在陸續更新~~~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/224032.html
標籤:其他
