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