前端面试JavaScript编程

来源:互联网 发布:apache 监控 编辑:程序博客网 时间:2024/05/16 18:14

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;    };