1. 程式人生 > >前端常見手寫筆試題

前端常見手寫筆試題

map 實現 err 快速排序 cas floor pub span family

1.獲取數組中最大值
var arr=[1,2,3,4,3,2,1];

function getMax(arr){

for(var i=0,max=arr[0];

i<arr.length;

arr[i]>max&&(max=arr[i]),i++);

return max;//返回max

}

console.log(getMax(arr));//4
2.數組去重
方法一:

var arr=["a","b","a","c","a","b"];

function unique1(arr){

//遍歷arr中每個元素,同時聲明空數組uarr

for(var i=0,uarr=[];i<arr.length;i++){

//遍歷uarr中每個元素

for(var j=0;j<uarr.length;j++){

//如果uarr中當前元素等於arr中當前元素

if(uarr[j]==arr[i]){

break;//就退出循環

}

}//(遍歷結束)

//如果j等於uarrlength

//

arr中當前元素加入uarr

j==uarr.length&&(uarr[j]=arr[i]);

}//(遍歷結束)

return uarr;//返回uarr

}
方法二:
function unique2(arr){

//遍歷arr中每個元素,同時創建空數組hash

for(var i=0,hash=[];i<arr.length;i++){

//如果hash中以arr中當前元素值為key的元素等於undefined

if(hash[arr[i]]===undefined){

//就在hash中添加一個新元素,keyarr中當前元素,值為1

hash[arr[i]]=1;

}

}//(遍歷結束)hash:["a":1,"b":1,"c":1]

i=0;//設置i=0

var keys=[]//定義空數組keys

for(keys[i++] in hash);

return keys;

}
3.冒泡排序
function bubbleSort(arr){

//r1開始,到<length結束

for(var r=1;r<arr.length;r++){

for(var i=0;i<arr.length-r;i++){

if(arr[i]>arr[i+1]){

//交換當前元素和下一個元素的位置

//方法1: a+=b; b=a-b; a-=b;

//方法2: b=[a,a=b][0];

arr[i+1]=

[arr[i],arr[i]=arr[i+1]][0];

}

}

}

}
4.插入排序
function insertSort(arr){

for(var i=1;i<arr.length;i++){

var temp=arr[i];

var p=i-1;

while(temp<arr[p]&&p>=0){

arr[p+1]=arr[p];

p--;

}

arr[p+1]=temp;

}

}

5.快速排序
function quickSort(arr){

if(arr.length<=1){return arr;}

else{

var c=Math.floor(arr.length/2);

var center=arr.splice(c,1)[0];

var left=[],right=[];

for(var i=0;i<arr.length;i++){

if(arr[i]<=center){left.push(arr[i])}

else{right.push(arr[i])}

}

return quickSort(left)

.concat(center,quickSort(right));

}

}

6.十進制轉二進制
function dec2bin(dec){

var bin=[];//聲明空數組bin

//只要dec>0,就反復

while(dec>0){

bin.unshift(dec%2);

dec=parseInt(dec/2);

}//(遍歷結束)

return bin.join("");

}
7.將英文句子中的每個單詞首字母轉大寫
var str="we two who and who";

//\b[a-z]+\b

str=str.replace(/\b[a-z]/g,

function(kwd){

return kwd.toUpperCase();

}

);
8.每個單詞後面添加逐漸增加的數字
var str="we two who and who";

var i=5;

str=str.replace(/\b[a-z]+\b/g,

function(kwd){

return kwd+i++;

}

);
9.刪除開頭或結尾空字符串
function ltrim(str){

return str.replace(/^\s+/,"");

}

function rtrim(str){

//" \t張 東 \t" =>" \t張 東"

return str.replace(/\s+$/,"");

}

function trim(str){

//" \t張 東 \t" =>"張 東"

return str.replace(/^\s+|\s+$/g,"");

}
10.格式化
var date="20160830二下0434";

date=date.replace(

/(\d{4})(\d{2})(\d{2})([\u4e00-\u9fa5])([\u4e00-\u9fa5])(\d{2})(\d{2})/,

"$1$2$3日 星期$4 $5$6:$7");


11.定義indexOf函數,可以從指定位置開始,查找下一個指定值得下標位置,如果找不到,返回-1

function indexOf(arr,val,fromi){

fromi===undefined&&(fromi=0);

for(;fromi<arr.length;fromi++){

if(arr[fromi]==val){

return fromi;//返回fromi

}

}

return -1; //返回-1

}
12.擴展Array類型的indexOf方法
if(Array.prototype.indexOf===undefined){

Array.prototype.indexOf=

function(val,fromi){

fromi===undefined&&(fromi=0);

for(;fromi<this.length;fromi++){

if(this[fromi]==val){

return fromi; }

}

return -1;

}

}

13.判斷一個對象是不是數組
var obj={},arr=[],obj2={};obj2.__proto__=arr;
方法一:document.write(//isPrototypeOf

"<br>"+Array.prototype.isPrototypeOf(obj)+

"<br>"+Array.prototype.isPrototypeOf(arr)+

"<br>"+Array.prototype.isPrototypeOf(obj2)

);

方法二: document.write(//instanceof

"<br>"+(obj instanceof Array)+

"<br>"+(arr instanceof Array)+

"<br>"+(obj2 instanceof Array)

);

方法三: document.write(//Object.prototype.toString

"<br>"+(Object.prototype.toString.call(obj)

=="[object Array]")+

"<br>"+(Object.prototype.toString.call(arr)

=="[object Array]")+

"<br>"+(Object.prototype.toString.call(obj2)

=="[object Array]")

);

方法四: //如果Array構造函數沒有isArray

if(Array.isArray===undefined){

//Array的構造函數中添加isArray=

Array.isArray=function(obj){

//強行用obj調用Object.prototype.toString,如果結果是"[object Array]",就返回true

//否則,返回false

return Object.prototype.toString

.call(obj)

=="[object Array]"?

true:false;

}

}

document.write(//Array.isArray(obj);//ES5

"<br>"+Array.isArray(obj)+

"<br>"+Array.isArray(arr)+

"<br>"+Array.isArray(obj2)

);
14.實現一個js類型,既包含公有屬性,又包含私有屬性
function Emp(id,name,age,salary){

//public

this.id=id;

this.name=name;

this.salary=salary;

var _age;//private

//配置屬性的特性:

Object.defineProperties(this,{

id:{

writable:false,configurable:false

},

salary:{//設置salary不可遍歷

enumerable:false,configurable:false

},

age:{//添加訪問器屬性保護局部變量_age

set:function(val){

if(val<18||val>65)

throw new Error(

"年齡必須介於18~65之間");

_age=val;

},

get:function(){return _age},

enumerable:true,

configurable:true

}

});//this(當前對象)已經有了訪問器屬性age

this.age=age;

Object.seal(this);

}
15.手寫bind方法
if(Function.prototype.bind===undefined){

//就在函數類型的原型中添加bind方法,定義1個參數obj

Function.prototype.bind=

function(obj/*,args1*/){

var fun=this;//this->原函數對象

var args1= Array.prototype.slice.call(

arguments,1

);//arguments.slice(1)`

return function(/*args2*/){//返回新函數:

var args2=

Array.prototype.slice.call(

arguments

);//arguments.slice();

fun.apply(

obj,args1.concat(args2)

);

}

}

}
16.手寫foreach,map 方法
if(Array.prototype.forEach===undefined){

//就為Array的原型添加forEach方法,參數定義為callback

Array.prototype.forEach=

function(callback){

//遍歷當前數組中每個元素

for(var i=0;i<this.length;i++){

//如果當前元素不是undefined

if(this[i]!==undefined){

//調用callback,傳入當前元素值,當前位置,當前數組作為參數

callback(this[i],i,this);

}

}

}

}
if(Array.prototype.map===undefined){

//就為Array的原型添加map方法,參數定義為callback

Array.prototype.map=

function(callback){

//創建一個空數組arr

var arr=[];

//遍歷原數組中每個元素

for(var i=0;i<this.length;i++){

//如果原數組中當前元素不是undefined

if(this[i]!==undefined){

//調用callback,傳入當前元素值,當前位置,原數組,將結果保存到arr的相同位置

arr[i]=

callback(this[i],i,this);

}

}//(遍歷結束)

return arr;//返回arr

}

}

前端常見手寫筆試題