一些前端開發的筆試題及答案(期待更好的答案)


前些天有網友發來一些前端面試的題目,雖然說不是很難,但卻是我們開發過程中經常碰到的問題,而且有些公司也喜歡面試這類的題目來考察面試者的能力,所以我覺得有必要收集一下有關這些的題目。

題目一:找出字符串中出現次數最多的那一個字符?

要解答這道題其實很簡單,但怎么答得好才是關鍵,你寫出的方法性能好才能得高分

 1 // 方法一(推薦)
 2 // 用到了正則,然后剔除了已計算過的字符,減少了循環的次數,所以性能是比較好的
 3 function getMostChar1(str){
 4     var mostChar = [],
 5         maxLen = 0,
 6         oldStr, char, reChar, charLen;
 7     
 8     while(str !== ''){
 9         oldStr = str;
10         char = str.charAt(0);
11         reChar = char;
12         
13         // 如果是正則特殊字符,則轉義
14         if(/[\$\(\)\*\+\.\?]/.test(reChar)) reChar = '\\' + reChar;
15         str = str.replace(new RegExp(reChar, 'g'), '');
16         
17         charLen = oldStr.length - str.length;
18         if(charLen > maxLen){
19             mostChar = [char];
20             maxLen = oldStr.length - str.length;
21         }else if(charLen === maxLen){
22             mostChar.push(char);
23         }
24     }
25     return {'mostChar': mostChar.join(), 'maxLen': maxLen};
26 }
27 
28 // 方法2 
29 // 1、轉換成鍵值格式數據 eg.'程序員程序員' -> {'程': 2, '序': 2, '員': 2} 
30 // 2、再轉換成數組格式 eg.{'程': 2, '序': 2, '員': 2}  ->[2]:['程', '序', '員']。
31 function getMostChar2(str) {
32     var strArr = str.split(''), 
33         obj = {}, 
34         arr = [],
35         len = strArr.length, i, key;
36         
37     for(i = 0; i < len; i++){
38         obj[strArr[i]] ? obj[strArr[i]]++ : obj[strArr[i]] = 1; //記錄數目
39     }
40     
41     for(key in obj){
42         arr[obj[key]] ? arr[obj[key]].push(key) : arr[obj[key]] = [key]; //取出
43     }
44     
45     return {'mostChar': arr[arr.length - 1].join(), 'maxLen': arr.length - 1};
46     
47 }
48 
49 // 方法3
50 // 代碼最少,充分利用數組的sort方法根據出現頻繁排序。
51 function getMostChar3(str){
52     var most = str.split('').sort().join('').match(/(.)\1*/g); //排列重復字符
53     most = most.sort(function(a,b){
54                     return a.length - b.length
55                 })
56                 .pop();//按出現頻繁排序
57     return {'mostChar': most.charAt(0), 'maxLen': most.length};
58 } 

題目二:請寫一個將字符串轉成駝峰的方法?例如:border-bottom-color  -> borderBottomColor

1 function camelCase(str){
2     return str && str.replace(/-([a-z]|[0-9])/ig, function(all, $1){
3         return ($1 + '').toUpperCase();
4     });
5 }

題目三:寫一個方法,為元素添加class?

// 使用方式:addClass(oDiv,'b');
// 使用前:<div class="a"></div>
// 使用后:<div class="a b"></div>
// 如果該元素內已有一個class名為“b”,就不能重復添加

1 function addClass(elem, className){
2     if(!elem) return;
3     var reClass = new RegExp('\\b' + className + '\\b');
4     !reClass.test(elem.className) && (elem.className += ' ' + className);
5 }

題目四:寫一個方法,把字符串反轉,例如reverse(str)

// var str='我愛你';
// alert(reverse(str));
// 彈出結果:'你愛我';

巧妙地運用了數組的reverse方法,所以高效

1 if(!String.prototype.reverse){
2     String.prototype.reverse = function(){
3         return this.split('').reverse().join('');
4     };
5 }

題目五:為數組寫一個獲取索引方法:indexOf()

 1 if(!Array.prototype.indexOf){
 2     Array.prototype.indexOf = function(value){
 3         for(var i=0, len=this.length, item; i<len; i++){
 4             item = this[i];
 5             if(item === value){
 6                 return i;
 7             }
 8         }
 9         return -1;
10     }
11 }

題目六:為數組寫一個檢測是否包含值方法:contains()

 1 if(!Array.prototype.contains){
 2     Array.prototype.contains = function(value){
 3         for(var i=0, len=this.length, item; i<len; i++){
 4             item = this[i];
 5             if(item === value){
 6                 return true;
 7             }
 8         }
 9         return false;
10     }
11 }

題目七:為數組寫一個去重方法:unique()

if(!Array.prototype.unique){
    Array.prototype.unique = function(value){
        var newArr = [], done = {};
        for(var i=0, len=this.length, item; i<len; i++){
            item = this[i];
            if(!done[item]){
                newArr.push(item);
                done[item] = true;
            }
        }
        return newArr;
    }
}

題目八:寫一個方法region(),獲取數字的區間

// 示例1:alert(region(3,6));
// 彈出結果:4,5
// 示例2:alert(region(9,5));
// 彈出結果:8,7,6

 1 function region(num1, num2){
 2     var min = Math.min(num1, num2),
 3         max = Math.max(num1, num2),
 4         ret = [];
 5     for(++min; min < max; ){
 6         ret.push(min++);
 7     }
 8     if(num1 > num2) return ret.reverse().join();
 9     
10     return ret.join();
11 }

題目九:請將數組的日期從前到后排序

// var myDate=['2012-4-19','2012-4-29','2012-4-2','2012-4-5'];
// 輸出:['2012-4-2','2012-4-5','2012-4-19','2012-4-29']

1 function sortDate(arr){
2     return arr.sort(function(date1, date2){
3         // 統一轉換成 yyyy/MM/dd 的格式,兼容IE,否則new Date返回NaN
4         date1 = date1.replace('-', '/');
5         date2 = date2.replace('-', '/');
6         return new Date(date1).getTime() - new Date(date2).getTime();
7     });
8 }

題目十:寫一個getStyle()函數,獲取div的邊框粗細,並兼容所有瀏覽器

// #div1{ width:100px; height:100px; border:5px solid red;}
// getStyle(div1, 'border-top-width');

 1 function getStyle(elem, cssArr){
 2     if(elem && elem.nodeType){
 3         // border-top -> borderTop
 4         cssArr = typeof cssArr === 'string' ? camelCase(cssArr) : '';
 5         
 6         // 優先獲取
 7         if(elem.style[cssArr]) return elem.style[cssArr];
 8         // for IE
 9         else if(elem.currentStyle) return elem.currentStyle[cssArr];
10         // for w3c
11         else if(document.defaultView && document.defaultView.getComputedStyle){
12             // borderTop -> border-top
13             cssArr = cssArr.replace(/([A-Z])/g, '-$1').toLowerCase();
14             
15             var style = document.defaultView.getComputedStyle(elem, '');
16             return style && style.getPropertyValue(cssArr);
17         }
18     }
19     return null;
20 }

題目十一:寫一個為字符串加密解密的方法:textEncode(),textDecode()

// var str='無賴君子';
// alert(textEncode(str));
// 執行結果: "62740-106526-52033-55520"

 1 function textEncode(text){
 2     var encodeArr = [];
 3     for(var i=0, len=text.length; i<len; i++){
 4         encodeArr.push(text.charCodeAt(i).toString(8));
 5     }
 6     return encodeArr.join('-');
 7 }
 8 
 9 function textDecode(text){
10     var encodeArr = text.split('-'),
11         decodeArr = [];
12     for(var i=0, len=encodeArr.length; i<len; i++){
13         decodeArr.push(String.fromCharCode(parseInt(encodeArr[i], 8)));
14     }
15     return decodeArr.join('');
16 }

暫時就收集這些,長期更新。而且以上的答案也不一定是最好的,如果讀者們有更好的答案,希望能留言。

歡迎加入web前端交流群(75701468) 分享您我的經驗,相互交流,共享資源,不怕競爭,才會學習得更快。

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM