上一篇:《前端常見面試題彙總(二)》
1.Ajax的優缺點及工作原理?
定義和用法:
AJAX = Asynchronous JavaScript and XML(異步的 JavaScript 和 XML)。Ajax 是一種用于建立快速動态網頁的技術。Ajax 是一種在無需重新加載整個網頁的情況下,能夠更新部分網頁的技術。
傳統的網頁(不使用 Ajax)如果需要更新内容,必須重載整個網頁頁面。
優點:
1.減輕伺服器的負擔,按需取資料,最大程度的減少備援請求
2.局部重新整理頁面,減少使用者心理和實際的等待時間,帶來更好的使用者體驗
3.基于xml标準化,并被廣泛支援,不需安裝插件等,進一步促進頁面和資料的分離
缺點:
1.AJAX大量的使用了javascript和ajax引擎,這些取決于浏覽器的支援.在編寫的時候考慮對浏覽器的相容性.
2.AJAX隻是局部重新整理,是以頁面的後退按鈕是沒有用的.
3.對流媒體還有移動裝置的支援不是太好等
AJAX的工作原理:
1.建立ajax對象(XMLHttpRequest/ActiveXObject(Microsoft.XMLHttp))
2.判斷資料傳輸方式(GET/POST)
3.打開連結 open()
4.發送 send()
5.當ajax對象完成第四步(onreadystatechange)資料接收完成,判斷http響應狀态(status)200-300之間或者304(緩存)執行回調函數
2.寫一個function,清除字元串前後的空格。
function trim(str) {
if (str && typeof str === "string") {
return str.replace(/(^\s*)|(\s*)$/g,""); //去除前後空白符
}
}
3.規避javascript多人開發函數重名問題
命名空間
封閉空間
js子產品化mvc(資料層、表現層、控制層)
seajs
變量轉換成對象的屬性
對象化
4.開發過程中遇到的記憶體洩露情況,如何解決的?
1、定義和用法:
記憶體洩露是指一塊被配置設定的記憶體既不能使用,又不能回收,直到浏覽器程序結束。C#和Java等語言采用了自動垃圾回收方法管理記憶體,幾乎不會發生記憶體洩露。我們知道,浏覽器中也是采用自動垃圾回收方法管理記憶體,但由于浏覽器垃圾回收方法有bug,會産生記憶體洩露。
2、記憶體洩露的幾種情況:
(1)、當頁面中元素被移除或替換時,若元素綁定的事件仍沒被移除,在IE中不會作出恰當處理,此時要先手工移除事件,不然會存在記憶體洩露。
例如:
<div id="myDiv">
<input type="button" value="Click me" id="myBtn">
</div>
<script type="text/javascript">
var btn = document.getElementById("myBtn");
btn.onclick = function(){
btn.onclick = null; //手工移除事件
document.getElementById("myDiv").innerHTML = "Processing...";
}
</script>
(2)、由于是函數内定義函數,并且内部函數–事件回調的引用外暴了,形成了閉包。閉包可以維持函數内局部變量,使其得不到釋放。
執行個體如下:
function bindEvent(){
var obj=document.createElement("XXX");
obj.onclick=function(){
//Even if it's a empty function
}
obj=null;//釋放掉
}
5.怎樣添加、移除、移動、複制、建立和查找節點?
1)建立新節點
createDocumentFragment() //建立一個DOM片段
createElement() //建立一個具體的元素
createTextNode() //建立一個文本節點
2)添加、移除、替換、插入
appendChild() //添加
removeChild() //移除
replaceChild() //替換
insertBefore() //插入
3)查找
getElementsByTagName() //通過标簽名稱
getElementsByName() //通過元素的Name屬性的值
getElementById() //通過元素Id,唯一性
6.數組排序 – 冒泡排序
冒泡排序:即實作數組由小到大進行排序;思路為:每次比較相鄰的兩個數,如果後一個比前一個小,換位置。如果要實作由大到小排序,使用reverse()即可;
var arr = [3, 1, 4, 6, 5, 7, 2];
function bubbleSort(arr) {
var len = arr.length;
for (var i = len; i >= 2; --i) {
for (var j = 0; j < i - 1; j++) {
if (arr[j + 1] < arr[j]) {
var temp;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}
var arr2 = bubbleSort(arr);
console.log(arr2); // [1, 2, 3, 4, 5, 6, 7]
var arr3 = arr2.reverse();
console.log(arr3); // [7, 6, 5, 4, 3, 2, 1]
7.數組的翻轉(非reverse())
var arr = [1,2,3,4];
var arr2 = [];
while(arr.length) {
var num = arr.pop(); //删除數組最後一個元素并傳回被删除的元素
arr2.push(num);
}
console.log(arr2);
// [4, 3, 2, 1]
var arr = [1,2,3,4];
var arr2 = [];
while(arr.length){
var num = arr.shift(); //删除數組第一個元素并傳回被删除的元素
arr2.unshift(num);
}
console.log(arr2);
8.數組排序 – 快速排序
快速排序:
思路:采用二分法,取出中間數,數組每次和中間數比較,小的放到左邊,大的放到右邊。
var arr = [3, 1, 4, 6, 5, 7, 2, 8];
function quickSort(arr) {
if(arr.length == 0) {
return []; // 傳回空數組
}
var cIndex = Math.floor(arr.length / 2);
var c = arr.splice(cIndex, 1);
var l = [];
var r = [];
for (var i = 0; i < arr.length; i++) {
if(arr[i] < c) {
l.push(arr[i]);
} else {
r.push(arr[i]);
}
}
return quickSort(l).concat(c, quickSort(r));
}
console.log(quickSort(arr));
//[1, 2, 3, 4, 5, 6, 7, 8]
9. 比較typeof與instanceof?
相同點:JavaScript 中 typeof 和 instanceof 常用來判斷一個變量是否為空,或者是什麼類型的。
typeof的定義和用法:傳回值是一個字元串,用來說明變量的資料類型。
細節:
(1)、typeof 一般隻能傳回如下幾個結果:number,boolean,string,function,object,undefined。
(2)、typeof 來擷取一個變量是否存在,如 if(typeof a!=“undefined”){alert(“ok”)},而不要去使用 if(a) 因為如果 a 不存在(未聲明)則會出錯。
(3)、對于 Array,Null 等特殊對象使用 typeof 一律傳回 object,這正是 typeof 的局限性。
Instanceof定義和用法:instanceof 用于判斷一個變量是否屬于某個對象的執行個體。
執行個體示範:
a instanceof b?alert(“true”):alert(“false”); //a是b的執行個體?真:假
var a = new Array();
alert(a instanceof Array); // true
alert(a instanceof Object) // true
如上,會傳回 true,同時 alert(a instanceof Object) 也會傳回 true;這是因為 Array 是 object 的子類。
function test(){};
var a = new test();
alert(a instanceof test) // true
細節:
(1)、如下,得到的結果為‘N’,這裡的 instanceof 測試的 object 是指 js 文法中的 object,不是指 dom 模型對象。
if (window instanceof Object){
alert('Y')
} else {
alert('N');
} // 'N'
10.iframe有那些缺點?
iframe會阻塞首頁面的Onload事件;
搜尋引擎的檢索程式無法解讀這種頁面,不利于SEO;
iframe和首頁面共享連接配接池,而浏覽器對相同域的連接配接有限制,是以會影響頁面的并行加載。
使用iframe之前需要考慮這兩個缺點。如果需要使用iframe,最好是通過javascript動态給iframe添加src屬性值,這樣可以繞開以上兩個問題。