前端常見手寫筆試題
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等於uarr的length
//將
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中添加一個新元素,key為arr中當前元素,值為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){
//r從1開始,到<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
}
}
前端常見手寫筆試題