js筆試題系列之二 陣列與物件

2022-04-03 12:10:42 字數 2862 閱讀 3337

(1)快速建立乙個陣列,陣列中含有100個值為0元素。

方法一:

var arr = new array(100);

for(var i=0;i<100;i++)

方法二:

var arr = new array(100);

arr.join('0').split(''); //注意此方法結果0為字元型別

面試官會喜歡哪個答案呢?

(2)經典的陣列去重問題

陣列去重可以說是各大公司前端筆試中的常見題,以下列出幾種典型的解決方法

方法一:傳統雙迴圈對比法

function unique0(arr); //利用物件屬性唯一性

for(var i=0,l=arr.length; i三種方法都有各自的優缺點,第一種方法利用雙迴圈,所以當陣列很大的時候效率是最低的,第二種利用了es5的indexof方法,如果不考慮低版本ie的話(否則得先實現此方法)比較推薦,最後一種方法其實隱藏著乙個bug:由於這種方法利用的是物件屬性唯一性,當給物件屬性賦值為陣列元素時,陣列元素會被轉換成字串型別:unique2(['1,1',[1,1]])執行後返回了錯誤的結果["1,1"],也就是說此方法在多維陣列場景下是不可行的。

(3)刪除給定陣列的第二項和第三項,再將陣列最後乙個元素壓入陣列頭部

這裡考察了陣列操作的常用方法,我們以var arr = [1,2,3,4,5]為初始陣列,先來看這個解答結果: 

arr.splice(1,2).unshift(arr.pop()); ==>[1, 4]

這種解決方法結果並不是我們期望的,因為按照題目的要求結果應該是[5,1,4],那麼是**出問題了?原因就是這裡不能以這種鏈式寫法,因為splice方法的返回結果並不是原陣列了,而是擷取的陣列片段,所以正確解答只需要這樣改: 

arr.splice(1,2);

arr.unshift(arr.pop()); ==>[5,1,4]

(4)填空題,實現輸出['c','d']

var data = ;

object.keys(data).filter(function(x))

首先,你如果對object.keys或者filter兩個es5新增方法不了解的話,這道題目就很難回答了。如果這兩個方法都難不倒你,那你就離成功很近了,因為實際上只需要再下劃線直接填寫'x',就會返回['a','b','c','d'],那麼如何讓返回結果為['c','d']呢,聰明的你肯定已經想到了就是 x > 'b'。'c'、'd'和字元'b'比較結果為true所以能夠返回,而'a'、'b'元素比較為false,不予返回。

(5)**實現如下要求

var arr = [1,2];

var new_arr;

要求實現:

new_arr === arr ==>false

new_arr[0] == arr[0]; ==>true

new_arr[1] == arr[1]; ==>true

這道題目先要看懂意思,了解出題者意圖:題目要求new_arr不能嚴格等於arr,但是裡面的元素是相等的。我們知道實現陣列內元素相等很簡單,在這裡直接new_arr = arr就可以了,但是如果簡單賦值則無法滿足第乙個條件,即兩個陣列不能嚴格相等。所以,出題者希望答題者了解的地方在於對物件引用賦值的了解、如何實現物件值傳遞而不是引用傳遞兩個知識點。關於陣列的值傳遞解決辦法很簡單,只需要遍歷原陣列的元素複製過去即可,當然這裡不需要我們自己去寫個遍歷:

var new_arr = arr.slice();

//or

var new_arr = arr.concat();

上面兩個方法都可以實現題目要求。

(6)隨機選取5-105中的10個不重複隨機整數,然後按從小到大排序

這裡考了兩個點,不重複隨機數的獲得、數字陣列的排序,其中陣列排列不能夠直接用sort(),而必須傳乙個函式引數,否則將不能得到預期結果,因為陣列排序預設是按照字元比較:

方法一:

var arr = ; //存放不重複隨機數

var n;

while(arr.length < 10)

arr.sort(function(a,b));

console.log(arr);

方法二:

var arr = ; //存放所有可能數

for(var i=0;i<=100;i++)

arr.sort(function(a,b)).slice(0,10).sort(function(a,b));

方法二的思路和方法一明顯不同,這裡是把所有在範圍區間的整數先存放在arr中,然後依次呼叫——sort(順序打亂)——slice(取開頭10個元素)——sort(按大小排序返回)

(7)如何讓所有瀏覽器相容es5的陣列foreach方法

array.prototype.foreach || (array.prototype.foreach = function(fun) 

})

先檢測瀏覽器是否支援foreach,如果不支援則自己去寫乙個實現相同功能的同名方法,其它類似問題都可以按此思路解決。

(8)深度轉殖物件

var cloneobj = function(obj);

if(typeof obj !== 'object') else if(window.json) else

}return newobj;

};

在js中對於物件的賦值,經常聽到深拷貝和淺拷貝,淺拷貝就是直接物件賦值共同使用乙個引用位址,但大多時候我們並不希望這樣,而是希望物件之間能夠完全獨立,這個時候就需要深度轉殖了,基本原理是對物件的所有屬性進行遍歷複製。

js筆試題目記錄 二

請說出三種減少頁面載入時間的方法。1.優化 2.影象格式的選擇 gif 提供的顏色較少,可用在一些對顏色要求不高的地方 3.優化css 壓縮合併css,如margin top,margin left 4.後加斜槓 如www.campr.com 目錄,會判斷這個 目錄是什麼檔案型別,或者是目錄。6.減...

js物件與陣列

var element0 0 0 var element1 1 1 var col0 element0,element0 var col1 element1,element1 var arr col0 col1 alert arr 0 0 0 結果是 0 改變它的值 arr 0 0 0 1 改變的e...

面試筆試系列之二 鍊錶相關

下面有code的地方都經過了驗證的 list 的定義 typedef struct list 1.反轉乙個鍊錶,迴圈演算法。list reserve list by recurrence list l l next 0 return l item 2.反轉乙個鍊錶,遞迴演算法。list reserv...