javascript面試題

String(obj){

return 1、javascript中如何檢測一個變量是String類型?

方法一:typeof()

function isString(obj){

return typeof(obj) === "string" ? true : false;

}

方法二:

function isString(obj){

return obj.constructor === String ? true :false;

}

方法三:

faunction is

Object.prototype.toString.call(obj)==="[Object String]" ? true : false;

}

2、用js去除字符串空格

  • 方法一:使用replace正則匹配的方法
    • 去掉所有空格:str = str.replace(/\s*/g,"");
    • 去掉兩側空格:str = str.replace(/^\s*|\s*$/g,"");
    • 去掉左空格 : str = str.replace(/^\s*,"");
    • 去掉右側空格:str = str.replace(/(\s*$)/g,"");
  • 方法二:使用str.trim()方法
    • 侷限性:無法去除中間空格
    • 去掉右側空格:str.trimRight();
    • 去掉左側空格:str.trimLeft();
  • 方法三:使用jquery,$.trim(str)方法
    • 侷限性:無法去除中間空格

3、js字符串操作函數

  • concat() – 將兩個或多個字符的文本組合起來,返回一個新的字符串。
  • indexOf() – 返回字符串中一個子串第一處出現的索引。如果沒有匹配項,返回 -1 。
  • charAt() – 返回指定位置的字符。
  • lastIndexOf() – 返回字符串中一個子串最後一處出現的索引,如果沒有匹配項,返回 -1 。
  • match() – 檢查一個字符串是否匹配一個正則表達式。
  • substr() 函數 -- 返回從string的startPos位置,長度爲length的字符串
  • substring() – 返回字符串的一個子串。傳入參數是起始位置和結束位置。
  • slice() – 提取字符串的一部分,並返回一個新字符串。
  • replace() – 用來查找匹配一個正則表達式的字符串,然後使用新字符串代替匹配的字符串。
  • search() – 執行一個正則表達式匹配查找。如果查找成功,返回字符串中匹配的索引值。否則返回 -1 。
  • split() – 通過將字符串劃分成子串,將一個字符串做成一個字符串數組。
  • length – 返回字符串的長度,所謂字符串的長度是指其包含的字符的個數。
  • toLowerCase() – 將整個字符串轉成小寫字母。
  • toUpperCase() – 將整個字符串轉成大寫字母。

4、添加、移除、移動、複製、創建和查找節點

  • 創建新節點
    • createDocumentFragment() 創建一個DOM片段
    • createElement() 創建一個具體的元素
    • createTextNode() 創建一個文本節點
  • 添加、移除、替換、插入
    • appendChild() 添加
    • removeChild() 移除
    • replaceChild() 替換
    • insertChild() 插入
  • 查找
    • getElementsByTagName()通過標籤查找
    • getElementsByName()通過元素的Name屬性的值
    • getElementById() 通過元素ID 唯一性

5、比較typeof與instanceof

  • typeof的定義和用法:返回一個字符串,用來說明變量的數據類型。
    • typeof一般只能返回幾個結果:number,boolean,string,function,object,undefined.
    • typeof來獲取一個變量是否存在
    • 對於 Array,Null 等特殊對象使用 typeof 一律返回 object,這正是 typeof 的侷限性。
  • Instanceof定義和用法:instanceof 用於判斷一個變量是否屬於某個對象的實例。

6、閉包:

  • 定義和用法:當一個函數的返回值是另外一個函數,而返回的那個函數如果調用了其父函數內部的其它變量,如果返回的這個函數在外部被執行,就產生了閉包。
  • 表現形式:使函數外部能夠調用函數內部定義的變量。
  • 變量的作用域

理解閉包,首先必須理解Javascript特殊的變量作用域。

 

變量的作用域分類:全局變量和局部變量。

 

特點:

 

1、函數內部可以讀取函數外部的全局變量;在函數外部無法讀取函數內的局部變量。

 

2、函數內部聲明變量的時候,一定要使用var命令。如果不用的話,你實際上聲明瞭一個全局變量!

  • 使用閉包的注意點
    • 濫用閉包,會造成內存泄漏:由於閉包會使得函數中的變量都被保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成網頁的性能問題,在IE中可能導致內存泄露。解決方法是,在退出函數之前,將不使用的局部變量全部刪除。
    • 會改變父函數內部變量的值。所以,如果你把父函數當作對象(object)使用,把閉包當作它的公用方法(Public Method),把內部變量當作它的私有屬性(private value),這時一定要小心,不要隨便改變父函數內部變量的值。

7、跨域:

由於瀏覽器同源策略,凡是發送請求url的協議、域名、端口之間任意一個與當前地址不同即爲跨域。

存在跨域的情況:

  • 網絡協議不同
  • 端口不同
  • 域名不同
  • 子域名不同
  • 域名和與域名對應ip

跨域請求資源的方法

  • proxy代理
    • 定義和用法:proxy代理用於將發送給後臺服務器,通過服務器來發送請求,然後將請求的結果傳遞給前端。
    • 實現方法:通過nginx代理
    • 注意點:如果你的代理是https協議的請求,那麼你的proxy首先要信任該證書(尤其是自定義證書)或者忽略證書檢查,否則你的請求無法成功。
  • CORS 【Cross-Origin Resource Sharing】
    • 定義和用法:是現代瀏覽器支持跨域資源請求的一種最常用的方式。
    • 使用方法:一般需要後端人員在處理請求數據的時候,添加允許跨域的相關操作。
  • jsonp
    • 定義和用法:通過動態插入一個script標籤。瀏覽器對script的資源引用沒有同源限制,同時資源加載到頁面後會立即執行(沒有阻塞的情況下)。
    • 特點:通過情況下,通過動態創建script來讀取他域的動態資源,獲取的數據一般爲json格式。
    • 缺點:

  1、這種方式無法發送post請求

  2、另外要確定jsonp的請求是否失敗並不容易,大多數框架的實現都是結合超時時間來判定。

8、圾回收機制方式及內存管理

  • 回收機制方式
    • 定義和用法:垃圾回收機制(GC:Garbage Collection),執行環境負責管理代碼執行過程中使用的內存。
    • 原理:垃圾收集器會定期(週期性)找出那些不在繼續使用的變量,然後釋放其內存。但是這個過程不是實時的,因爲其開銷比較大,所以垃圾回收器會按照固定的時間間隔週期性的執行。
    • 垃圾回收策略:標記清除(較爲常用)和引用計數。
      • 標記清除:
        • 定義和用法:當變量進入環境時,將變量標記"進入環境",當變量離開環境時,標記爲:"離開環境"。某一個時刻,垃圾回收器會過濾掉環境中的變量,以及被環境變量引用的變量,剩下的就是被視爲準備回收的變量。
        • 目前爲止,IE、Firefox、Opera、Chrome、Safari的js實現使用的都是標記清除的垃圾回收策略或類似的策略,只不過垃圾收集的時間間隔互不相同。
      • 引用計數:
        • 定義和用法:引用計數是跟蹤記錄每個值被引用的次數。
        • 基本原理:就是變量的引用次數,被引用一次則加1,當這個引用計數爲0時,被視爲準備回收的對象。
  • 內存管理

1、什麼時候觸發垃圾回收?

 

垃圾回收器週期性運行,如果分配的內存非常多,那麼回收工作也會很艱鉅,確定垃圾回收時間間隔就變成了一個值得思考的問題。

 

IE6的垃圾回收是根據內存分配量運行的,當環境中的變量,對象,字符串達到一定數量時觸發垃圾回收。垃圾回收器一直處於工作狀態,嚴重影響瀏覽器性能。

 

IE7中,垃圾回收器會根據內存分配量與程序佔用內存的比例進行動態調整,開始回收工作。

 

2、合理的GC方案:(1)、遍歷所有可訪問的對象; (2)、回收已不可訪問的對象。

 

3、GC缺陷:(1)、停止響應其他操作;

 

4、GC優化策略:(1)、分代回收(Generation GC);(2)、增量GC

 

9、開發過程中遇到的內存泄露情況,如何解決的

  • 定義和用法:內存泄露是指一塊被分配的內存既不能使用,又不能回收,直到瀏覽器進程結束。C#和Java等語言採用了自動垃圾回收方法管理內存,幾乎不會發生內存泄露。我們知道,瀏覽器中也是採用自動垃圾回收方法管理內存,但由於瀏覽器垃圾回收方法有bug,會產生內存泄露。
  • 內存泄露的幾種情況:
    • 當頁面中元素被移除或替換時,若元素綁定的事件仍沒被移除,在IE中不會作出恰當處理,此時要先手工移除事件,不然會存在內存泄露。
    • 由於是函數內定義函數,並且內部函數--事件回調的引用外暴了,形成了閉包。閉包可以維持函數內局部變量,使其得不到釋放。

10、javascript面向對象中繼承實現

  • 面向對象的基本特徵有:封閉、繼承、多態。
  • 在JavaScript中實現繼承的方法:
    •  原型鏈(prototype chaining)

  • call()/apply()

  • 混合方式(prototype和call()/apply()結合)

  • 對象冒充

11、數組方法及屬性

方法:

  • arr.flat();數組扁平化

flat()默認只會“拉平”一層,如果想要“拉平”多層的嵌套數組,可以將flat()方法的參數寫成一個整數,表示想要拉平的層數,默認爲1。

  • concat() 連接兩個或更多的數組,並返回結果。
  • join() 把數組的所有元素放入一個字符串。元素通過指定的分隔符進行分隔。
  • pop() 刪除並返回數組的最後一個元素。 
  • shift() 刪除並返回數組的第一個元素
  • push() 向數組的末尾添加一個或更多元素,並返回新的長度。
  • unshift() 向數組的開頭添加一個或更多元素,並返回新的長度。
  • reverse() 顛倒數組中元素的順序。
  • slice() 從某個已有的數組返回選定的元素
  • sort() 對數組的元素進行排序
  • splice() 刪除元素,並向數組添加新元素。

語法:arrayObject.splice(index,howmany,item1,.....,itemX)

index:必需。整數,規定添加/刪除項目的位置,使用負數可從數組結尾處規定位置。

howmany:必需。要刪除的項目數量。如果設置爲 0,則不會刪除項目。

item1, ..., itemX:可選。向數組添加的新項目。

  • toSource() 返回該對象的源代碼。

只有 Gecko 核心的瀏覽器(比如 Firefox)支持該方法,也就是說 IE、Safari、Chrome、Opera 等瀏覽器均不支持該方法。

  • toString() 把數組轉換爲字符串,並返回結果。
  • toLocaleString() 把數組轉換爲本地數組,並返回結果。
  • valueOf() 返回數組對象的原始值

12、數組去重

let arr1=[1,2,3,4,5,6];

let arr2 = [2,3,6,7,8,10] ;

let newArr = […new Set([…arr1,arr2])].sort();

13、求數組最值

最大值:Math.max.apply(null,arr);

 

最小值:Math.min.apply(null,arr);

 

14、數組排序

冒泡排序:即實現數組由小到大進行排序;思路爲:每次比較相鄰的兩個數,如果後一個比前一個小,換位置。如果要實現由大到小排序,使用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]

快速排序:

思路:採用二分法,取出中間數,數組每次和中間數比較,小的放到左邊,大的放到右邊。

var arr = [3, 1, 4, 6, 5, 7, 2];

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]

15、數組翻轉(非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);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章