當前位置:編程學習大全網 - 源碼下載 - 分享幾個常見的js面試題

分享幾個常見的js面試題

1.創建JavaScript對象的兩種方法是什麽?

這是壹個非常簡單的問題,如果妳用過JavaScript的話。妳至少得知道壹種方法。但是,盡管如此,根據我的經驗,也有很多自稱是JavaScript程序員的人說不知道如何回答這個問題。

使用?new?關鍵字來調用函數。

open/close花括號。

var o = {};

妳也可以繼續提問,?使用new關鍵字,什麽情況下創建對象??但是,由於我只是想淘汰壹些人,所以這些問題我會等到真正面試的時候去問。

2.如何創建數組?

這和?如何創建對象?是相同級別的問題。然而,也有壹些人回答得了第壹個問題,卻不能回答這個問題。

用下面的代碼,簡簡單單就能創建壹個數組:

var myArray = new Array();

創建數組是壹個很復雜的過程。但是我希望能從應聘者口中聽到使用方括號的答案。

var myArray = [];

當然,我們還可以繼續問其他問題,比如如何高效地刪除JavaScript數組中的重復元素等,但是由於我們只需要知道應聘人員是否值得進壹步的觀察,關於數組的問題我會到此結束。

再來針對如何高效地刪除JavaScript數組中的重復元素說壹說:js 如何實現數組去重整理出5種方法。

具體的方法介紹:

1).遍歷數組法

最簡單的去重方法, 實現思路:新建壹新數組,遍歷傳入數組,值不在新數組就加入該新數組中;註意點:判斷值是否在數組的方法?indexOf?是ECMAScript5 方法,IE8以下不支持,需多寫壹些兼容低版本瀏覽器代碼,源碼如下:

// 最簡單數組去重法

function unique1(array){

var n = []; //壹個新的臨時數組

//遍歷當前數組

for(var i = 0; i //如果當前數組的第i已經保存進了臨時數組,那麽跳過,

//否則把當前項push到臨時數組裏面

if (n.indexOf(array[i]) == -1) n.push(array[i]);

}

return n;

}

// 判斷瀏覽器是否支持indexOf ,indexOf 為ecmaScript5新方法 IE8以下(包括IE8, IE8只支持部分ecma5)不支持

if (!Array.prototype.indexOf){

// 新增indexOf方法

Array.prototype.indexOf = function(item){

var result = -1, a_item = null;

if (this.length == 0){

return result;

}

for(var i = 0, len = this.length; i a_item = this[i];

if (a_item === item){

result = i;

break;

}

}

return result;

}

}

2).對象鍵值對法

該方法執行的速度比其他任何方法都快, 就是占用的內存大壹些;實現思路:新建壹js對象以及新數組,遍歷傳入數組時,判斷值是否為js對象的鍵,不是的話給對象新增該鍵並放入新數組。註意點: 判斷是否為js對象鍵時,會自動對傳入的鍵執行?toString()?,不同的鍵可能會被誤認為壹樣;例如: a[1]、a["1"] 。解決上述問題還是得調用?indexOf?。

// 速度最快, 占空間最多(空間換時間)

function unique2(array){

var n = {}, r = [], len = array.length, val, type;

for (var i = 0; i val = array[i];

type = typeof val;

if (!n[val]) {

n[val] = [type];

r.push(val);

} else if (n[val].indexOf(type) n[val].push(type);

r.push(val);

}

}

return r;

}

3).數組下標判斷法

還是得調用?indexOf?性能跟方法1差不多,實現思路:如果當前數組的第i項在當前數組中第壹次出現的位置不是i,那麽表示第i項是重復的,忽略掉。否則存入結果數組。

function unique3(array){

var n = [array[0]]; //結果數組

//從第二項開始遍歷

for(var i = 1; i //如果當前數組的第i項在當前數組中第壹次出現的位置不是i,

//那麽表示第i項是重復的,忽略掉。否則存入結果數組

if (array.indexOf(array[i]) == i) n.push(array[i]);

}

return n;

}

4).排序後相鄰去除法

雖然原生數組的?sort?方法排序結果不怎麽靠譜,但在不註重順序的去重裏該缺點毫無影響。實現思路:給傳入數組排序,排序後相同值相鄰,然後遍歷時新數組只加入不與前壹值重復的值。

// 將相同的值相鄰,然後遍歷去除重復值

function unique4(array){

array.sort();

var re=[array[0]];

for(var i = 1; i if( array[i] !== re[re.length-1])

{

re.push(array[i]);

}

}

return re;

}

5).優化遍歷數組法

源自外國博文,該方法的實現代碼相當酷炫;實現思路:獲取沒重復的最右壹值放入新數組。(檢測到有重復值時終止當前循環同時進入頂層循環的下壹輪判斷)

// 思路:獲取沒重復的最右壹值放入新數組

function unique5(array){

var r = [];

for(var i = 0, l = array.length; i for(var j = i + 1; j if (array[i] === array[j]) j = ++i;

r.push(array[i]);

}

return r;

}

3.什麽是變量提升(Variable Hoisting)?

這個問題稍微難壹點,我也並不要求對方壹定得回答出來。但是,通過這個問題能夠快速確定應聘者的技術水平:他們是否真的像他們聲明得那樣理解這門編程語言?

變量提升指的是,無論是哪裏的變量在壹個範圍內聲明的,那麽JavaScript引擎會將這個聲明移到範圍的頂部。如果在函數中間聲明壹個變量,例如在某壹行中賦值壹個變量:

function foo()

{

// 此處省略若幹代碼

var a = "abc";

}

實際上會這樣運行代碼:

function foo()

{

var a;

// 此處省略若幹代碼

a = "abc";

}

4.全局變量有什麽風險,以及如何保護代碼不受幹擾?

全局變量的危險之處在於其他人可以創建相同名稱的變量,然後覆蓋妳正在使用的變量。這在任何語言中都是壹個令人頭疼的問題。預防的方法也有很多。其中最常用的方法是創建壹個包含其他所有變量的全局變量:

var applicationName = {};

然後,每當妳需要創建壹個全局變量的時候,將其附加到對象上即可。

applicationName.myVariable = "abc";

還有壹種方法是將所有的代碼封裝到壹個自動執行的函數中,這樣壹來,所有聲明的變量都聲明在該函數的範圍內。

(function(){

var a = "abc";

})();

在現實中,這兩種方法妳可能都會用到。

5.如何通過JavaScript對象中的成員變量叠代?

for(var prop in obj){

// bonus points for hasOwnProperty

if(obj.hasOwnProperty(prop)){

// do something here

}

}

6.什麽是閉包(Closure)?

閉包允許壹個函數定義在另壹個外部函數的作用域內,即便作用域內的其他東西都消失了,它仍可以訪問該外部函數內的變量。如果應聘者能夠說明,在for/next循環中使用閉包卻不聲明變量來保存叠代變量當前值的壹些風險,那就應該給對方加分。

7.請描述妳經歷過的JavaScript單元測試。

關於這個問題,其實我們只是想看看應聘人員是否真的做過JavaScript單元測試。這是壹個開放式問題,沒有特定的正確答案,不過對方至少得能講述進程中的壹些事情。

  • 上一篇:DW建站怎麽制作設計網頁終極教程
  • 下一篇:學嵌入式需要什麽基礎?
  • copyright 2024編程學習大全網