前端面试JavaScript编程

1.请写一个字符串转成驼峰的方法?例如:border-bottom-color  -> borderBottomColor。

function camel(str){
     str=str.replace(/-([a-z])/g,function(a,b){
	            return b.toUpperCase();
           });
    return str;
}
 var str = 'border-bottom-color'
 alert(camel(str));//borderBottomColor

jQuery中实现的方式:

var rmsPrefix = /^-ms-/,
rdashAlpha = /-([\da-z])/gi;
fcamelCase = function( all, letter ) {
	return letter.toUpperCase();
};
camelCase = function( string ) {
		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
};
利用数组实现:

function camel(string){
	var arr = string.split('-');
	for(i=0;i<arr.length;i++){
		arr[1]=arr[i].charAt(0).toUpperCase() +arr[i].substr(1);
	}
	arr = arr.join('');
	return arr;
}
 var str = 'border-bottom-color'
 alert(camel(str));//borderBottomColor
ECMAScript还提供了三个基于子字符串创建新字符串的方法:slice()substr()substring()。这三个方法都会返回被操作字符串的一个子字符串,而且也都接受一或两个参数。第一个参数指定子字符串的开始位置,第二个参数(在指定的情况下)表示子字符串到哪里结束。具体来说,slice()substring()的第二个参数指定的是子字符串最后一个字符后面的位置。而substr()的第二个参数指定的则是返回的字符个数。如果没有给这些方法传递第二个参数,则将字符串的长度作为结束位置。与concat()方法一样,slice()substr()substring()也不会修改字符串本身的值——它们只是返回一个基本类型的字符串值,对原始字符串没有任何影响。请看下面的例子。
var stringValue = "hello world";
alert(stringValue.slice(3)); //"lo world"
alert(stringValue.substring(3)); //"lo world"
alert(stringValue.substr(3)); //"lo world"
alert(stringValue.slice(3, 7)); //"lo w"
alert(stringValue.substring(3,7)); //"lo w"
alert(stringValue.substr(3, 7)); //"lo worl"
 slice()、 substr()和 substring()只有一个参数时,三者效果相同;

如果记不清substr()和 substring()的区别,就只用substring()。

2.查找字符串中出现最多的字符和个数?例如:sdjksfssscfssdd  -> 字符最多的是s,出现了7次。
自己使用for循环:

var str = 'sdjksfssscfssdd';
//alert(str[0]);//s,如果是在 IE7 及更早版本中使用这种语法,会返回 undefined 值
function letterMost(str){
   var max=0,
   letter;
   var arr = str.split('');
   for(i=0;i<arr.length-1;i++){
     var n=1;
   	for(j=i+1;j<arr.length;j++){
   		if(arr[i]==arr[j]){
   			n++;
   		}
   	  }
   	if(max<n){
   		max=n;
   		letter=arr[i]
   	}
   }
   alert('出现最多的字母:'+letter+'出现次数:'+max);
}
letterMost(str);//出现最多的字母:s出现次数:7
利用json:
var str = 'sdjksfssscfssdd';
function letterMost(str){
   var arr = str.split('');
   var obj = {};
   var maxnum=0,maxletter=0;
   for(i=0;i<arr.length;i++){
   	obj[arr[i]]?obj[arr[i]]++:obj[arr[i]]=1;
   	if(maxnum<obj[arr[i]]){
   		maxnum=obj[arr[i]];
   		maxletter=arr[i];
   	}
   }
   alert(maxletter+'出现了'+maxnum+'次');
}
letterMost(str);//s出现了7次

利用数组和正则表达式:

 function unique(str){
 	var max = 0,maxstr = '';
 	arr = str.split('').sort();
 	str = arr.join('');
 	str.replace(/(\w)\1+/g,function(a,b){
 		if(a.length>max){
 			max = a.length;
 			maxstr =b;
 		}
 	})
 	return maxstr+'出现的次数是'+max;
 }

3.如何给字符串加千分符?例如:3562123761  -> 3,562,123,761。

使用正则表达式:

var str = '3562123761';
function qianfenfu(str){
	return str.replace(/(\d)(?=(\d{3})+$)/g,'$1,');
}
alert(qianfenfu(str));
使用字符串函数:

var str = '3562123761';
function qianfenfu(str){
	var num = str.length%3;
	var arr = [];
	if(num!=0){
		arr.push(str.substring(0,num));
	}
	for(;num<str.length-1;num+=3){
		arr.push(str.substr(num,3))
	}
	return arr.join(',');
}
alert(qianfenfu(str));

4.数组去重:

使用indexOf()方法,缺点:在IE6-8浏览器中,不存在此方法。

function unique(arr) {
  var ret = [];
  var hash = {};
  for (var i = 0; i < arr.length; i++) {
    var item = arr[i];
    
    if(ret.indexOf(item)===-1){
    	ret.push(item);
    }
  }
  return ret;
}
 var arr = [112,'1','你好',112,1,'你好','str','str1'];
console.log(unique(arr));

利用json对象实现:

function unique(arr) {
  var ret = [];
  var hash = {};
  for (var i = 0; i < arr.length; i++) {
    var item = arr[i];
    var key = typeof(item) + item;
    if(!hash[key]){
    	ret.push(item);
    	hash[key]=true;
    }
  }
  return ret;
}
 var arr = [112,'1','你好',112,1,'你好','str','str1'];
console.log(unique(arr));

在 JavaScript 里,对象的键值只能是字符串,因此需要var key = typeof(item) + item 来区分数值 1 和字符串 '1' 等情况。

5.数组排序:[1,55,33,23,56,7,8,99]=>[1,7,8,23,33,55,56,99]

利用JavaScript中数组函数sort进行排序:

  var arr=[1,55,33,23,56,7,8,99];
   function compare(a,b){
   	return a-b;
   }
   arr.sort(compare);
   alert(arr);//1,7,8,23,33,55,56,99
sort(compare)的实现:利用了冒泡算法,将数组中的相邻的元素传递给compare()函数,compare()返回真,则进行互换。

当a[i]>a[i+1]时,compare()>0为真,两者值进行互换

	function compare(a,b){
		return a-b;
	}
   function sort(arr,compare){
   	for(var i=0;i<arr.length;i++){
   		for(var j=0;j<arr.length-1-i;j++){
   			if(compare(arr[j],arr[j+1])>0){
   				var temp=arr[j];
   				arr[j]=arr[j+1];
   				arr[j+1]=temp;
   			}
   		}
   		
   	}
   }
   var arr=[1,55,33,23,56,7,8,99];
   sort(arr,compare);
   alert(arr);//1,7,8,23,33,55,56,99
将compare()改为:

function compare(a,b){
		return b-a;
	}
当a[i]<a[i+1]时, compare()>0为真,两者值进行互换,就是逆序排列。

选择排序:无论什么数据排序都是O(n2)的时间复杂度。

function selectSort(arr){
   	var temp = 0;
   	 for(var i=0;i<arr.length-1;i++){
   	 	for(var j=i+1;j<arr.length;j++){
   	 		if(arr[i]>arr[j]){
   	 			temp = arr[i];
   	 			arr[i] = arr[j];
   	 			arr[j] = temp;
   	 		}
   	 	}
   	 }
   }
   var arr=[1,55,33,23,56,7,8,99];
   selectSort(arr);
   alert(arr);//1,7,8,23,33,55,56,99
快速排序:T(n)=O(nlogn)

function quickSort(arr){
   	if(arr.length<=1){
   		return arr;
   	}
   	var pivotIndex = Math.floor(arr.length/2)
   	var left = [];
   	var right = [];
   	var pivot = arr.splice(pivotIndex,1)[0];
   	for(var i=0;i<arr.length;i++){
   		if(arr[i]<pivot){
   			left.push(arr[i]);
   		}else{
   			right.push(arr[i])
   		}
   	}
   	return quickSort(left).concat([pivot],quickSort(right));
   }
   var arr=[1,55,33,23,56,7,8,99];
   alert(quickSort(arr));//1,7,8,23,33,55,56,99
插入排序:T(n)=O(n2)

  function insertSort(arr){
   	for(var i = 1;i<arr.length;i++){
   		var temp = arr[i];//关键是先将arr[i]取出来
   		var j = i-1;
   		while(j>=0&&arr[j]>temp){
   			arr[j+1]=arr[j];
   			j--;
   		}
   		arr[j+1]=temp;
   	}
   	return arr;
   }
   var arr=[1,55,33,23,56,7,8,99];
   alert(insertSort(arr));//1,7,8,23,33,55,56,99

6.截取URL地址中的query部分:

function param(url){
	if(url.indexOf('?')===-1){
		return '不存在参数';
	}
	var arr=url.split('?');
	var arr1=arr[1].split('&');
	var arr2=[];
	var obj = {};
	for(var i = 0;i<arr1.length;i++){
		arr2=arr1[i].split('=');
		obj[arr2[0]]=arr2[1];
	}
	return obj;
}

7.用js实现随即选取10–100之间的10个数字,存入一个数组,并排序
function randomSort(){
	var arr = [];
	for(var i=0;i<10;i++){
		var num = parseInt(Math.random()*90)+10;
		arr.push(num);
	}
	arr.sort(function(a,b){
		return a-b;
	});
	return arr;
}

8.JavaScript的bind()函数兼容处理:

Function.prototype.bind = Function.prototype.bind||function (context){
	var self = this;
	return function(){
		self.apply(context,arguments);
	};
}

9.如何将类数组对象,转化为数组,例如将arguments类数组转化为数组:

function list() {
  return Array.prototype.slice.call(arguments);
}

var list1 = list(1, 2, 3); // [1, 2, 3]

10.JavaScript实现深拷贝:

function deepCopy(copy,src){
		var copy = copy ||{};
		for(var i in src){
			if(typeof src[i]==='object'){//必须是字符串形式,且第一个字母是小写
				copy[i]=(src[i].constructor===Array)?[]:{};
				deepCopy(copy[i],src[i]);
			}else{
				copy[i]=src[i];
			}
		}
		return copy;
	}
var a = { name : { firstName : 'Tom' } };  
var b = { name : {firstName : 'Jack',lastName:'Simith'} };  
deepCopy(a,b);  
a.name.firstName= 'William';  
alert(a.name.firstName);//William  
alert(b.name.firstName);//Jack 
浅拷贝:

	function normalCopy(copy,src){
		var copy = copy ||{};
		for(var i in src){
			copy[i]=src[i];
		}
		   return copy;
	}
var a = { name : { firstName : 'Tom' } };  
var b = { name : {firstName : 'Jack',lastName:'Simith'} };  
normalCopy(a,b);  

a.name.firstName= 'William';  
alert(a.name.firstName);//William  
alert(b.name.firstName);//William
浅拷贝与深拷贝合并:第一个参数为布尔值,是否深拷贝
function clone(deep,copy,src){
		var copy = copy ||{};
		for(var i in src){
			if(deep){
				if(typeof src[i]==='object'){
					copy[i]=(src[i].constructor===Array)?[]:{};
					clone(deep,copy[i],src[i]);
				}else{
					copy[i]=src[i];
				}
			}else{
				copy[i]=src[i];
			}
		}
		   return copy;
	}
var a = { name : { firstName : 'Tom' } };  
var b = { name : {firstName : 'Jack',lastName:'Simith'} };  
clone(true,a,b);  //深拷贝
a.name.firstName= 'William';  
alert(a.name.firstName);//William  
alert(b.name.firstName);//Jack


var a = { name : { firstName : 'Tom' } };  
var b = { name : {firstName : 'Jack',lastName:'Simith'} };  
clone(false,a,b);  //浅拷贝
a.name.firstName= 'William';  
alert(a.name.firstName);//William  
alert(b.name.firstName);//William 

11.回文数:正读倒读都一样的整数,如1234321。求1000以内的回文数。

function palindrome(num){
	var str=num+'';
	var str1=str.split('').reverse().join('');
	if(str===str1){
		return true;
	}
}
var arr=[];
var n=0;
for(var i=0;i<1001;i++){
	var temp = palindrome(i);
	if(temp){
		arr.push(i);
		n++;
	}
}
alert(n);//109
12.二分查找:优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
查找6在[1,2,3,4,5,6,7,8,9,10,11]中的位置

	var arr=[1,2,3,4,5,6,7,8,9,10,11];
	var a=6;
	function binarySearch(a,arr){
		var mid=Math.floor(arr.length/2);
		if(a==arr[mid]){
			return mid;
		}else if(a<arr[mid]){
			var arr1=arr.slice(0,mid);
			binarySearch(a,arr1)
		}else{
			var arr1=arr.slice(mid);
			binarySearch(a,arr1);
		}
	}
	alert(binarySearch(a,arr));	//5

13.写一个重复打印字符串对象的方法,输入一个整数,这个整数代表重复打印的字数,比如:

console.log('hello'.repeatify(3));
这样会打印出hellohellohello。

String.prototype.repeatify =String.prototype.repeatify ||function(times){
    var str ='';
    for(var i =0; i < times; i++){
    str +=this;
    }
    return str;
    };

















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值