天天看點

前端常見面試題彙總(三)

上一篇:《前端常見面試題彙總(二)》

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屬性值,這樣可以繞開以上兩個問題。