前端面试题1
1.写一个字符串转成驼峰的方法?
例如:border-bottom-color=>borderBottomColor
方法1:利用字符串切割
var str = "border-bottom-color";
function test(str){ var arr=str.split('-'); for(var i = 1;i<arr.length;i++){ arr[i]=arr[i].charAt(0).toUpperCase()+arr[i].substring(1); } return arr.join(''); } test(str);
方法2:利用正则表达式
var str = "border-bottom-color";
function test(str){
var reg = /-(\w)/g;
return str.replace(reg,function($0,$1){
return $1.toUpperCase();
});
}
test(str);
2.查找字符串中出现最多的字符和个数?
例如:a i am who am=》出现次数最多的是a,出现了3次
方法1:利用json和数组实现
var str='aiamwhoam'; function test(str){ var obj={}; var num=0; var value=''; for(var i=0;i<str.length;i++){ if(!obj[str[i]]){ obj[str[i]]=[]; } obj[str[i]].push(str[i]); } for(var attr in obj){ if(num<obj[attr].length){ num=obj[attr].length; value=obj[attr][0]; } } return '最多的字符是'+value+'出现了'+num+'次'; } test(str);
方法2.利用正则表达式
function test(str){
var arr = str.split('');
arr.sort();
str=arr.join('');
var reg=/(\w)\1+/g;
var num=0;
var value=0;
str.replace(reg,function($0,$1){
if(num<$0.length){
num=$0.length;
value=$1;
}
});
return '出现最多的字符是:'+value+',出现了:'+num+'次;';
}
test('sdjksfssscfssdd');
3.如何给字符串加千分符?
例如:3255345434=>3,255,345,434
方法一:
function test(str){ var iNum=str.length%3; var prev=''; var arr=[]; var count=0; var tmp=''; if(iNum != 0){ prev=str.substring(0,iNum); arr.push(prev); } str=str.substring(iNum); for(var i=0;i<str.length;i++){ count++; tmp+=str[i]; if(count==3 && tmp){ arr.push(tmp); tmp=''; count=0; } } return arr.join(','); } test('1234567890');
方法二:
var str = '4324332512'; function test(str){ var reg = /(?=(?!\b)(\d{3})+$)/g; return str.replace(reg,','); } test(str);
4.求斐波那契数列的第n项的值?
例如:1,1,2,3,5,8,13,21,34……
fn(8)=21
方法一:递归实现
function aa(n){ if(n<=2){ return 1; } return aa(n-2)+aa(n-1); } aa(8);
方法二:迭代实现
function fa(n){ var num1=1; var num2=1; var num3=0; for(var i = 0;i<n-2;i++){ num3=num1+num2; num1=num2; num2=num3; } return num3; } fa(8);
5.数组排序
冒泡排序
var arr= [2,5,1,7,3];
function test(arr){
for(var i=0;i<arr.length;i++){ for(var j=0;j<arr.length-i;j++){ tem(j,j+1); } } return arr; } function tem(prev,next){ var tmp=''; if(arr[next]<arr[prev]){ tmp=arr[prev]; arr[prev]=arr[next]; arr[next]=tmp; } } test(arr);
选择排序
var arr= [2,5,1,7,3]; function select(arr){ if(arr.length==1) return arr; var min = arr[0]; var index=0; for(var i=0;i<arr.length;i++){ if(arr[i]<min){ min=arr[i]; index=i; } } var pre = arr.splice(index,1); return pre.concat(select(arr)); }
select(arr);
5.数组去重
方法一:
var arr= [2,5,1,7,3,2,3]; var result=[arr[0]]; for(var i=1;i<arr.length;i++){ if(comp(arr[i])){ result.push(arr[i]); } } function comp(val){ for(var i=0;i<result.length;i++){ if(val==result[i]) return false; } return true; } result
方法二:
function fn(arr){ var result = []; var obj = {}; for(var i=0;i<arr.length;i++){ if(!obj[arr[i]]){ result.push(arr[i]); obj[arr[i]]=1; } } return result; } fn([2,4,5,2,4,2,7,5]);
6.交换两个变量的值
方法1:利用中间变量
方法2:利用两个变量相加再相减(一般是用于两个整数交换)
方法3:利用数组
7.不适用for循环,根据一个数n,返回数组[1,2,3,4,5....n]
方法一:
var n=5;
function show(n){ var arr=[]; return (function(){ arr.unshift(n); n--; if(n!=0){ arguments.callee(); } return arr; })(); } show(n);
方法二:
function show(n){ var arr =[]; arr.length = n+1; var str = arr.join('a'); var result=[]; str.replace(/a/g,function(){ result.unshift(n--); }); return result; } show(5);
8.不允许使用if,实现一个数n,当n小于100时,返回n,否则就返回100
方法1:使用三目运算符
方法2:使用switch语句
方法3:利用Math.min(n,100),返回最小的一个
方法4.利用数组的sort方法,将两个n和100存入数组找到最小的一个
方法5.根据n的位数,用for语句进行判断实现
方法6.利用json和for in也可以实现
方法7:利用&&和||
9.JS深拷贝
方法1:var cloneObj = JSON.parse(JSON.stringify(obj));
缺陷:缺少constructor
方法2:如果一个对象中的所有属性值都是简单的值类型
function Copy(p) { var c = {}; for (var i in p) { c[i] = p[i]; } return c; }
方法3:要复制的对象中存在某一个属性的值类型是对象或者数组时,利用递归
function deepCopy(p, c) { var c = c || {}; for (var i in p) { if(! p.hasOwnProperty(i)){ continue; } if (typeof p[i] === 'object') { c[i] = (p[i].constructor === Array) ? [] : {}; deepCopy(p[i], c[i]); } else { c[i] = p[i]; } } return c; } Parent = {name: 'foo', birthPlaces: ['北京','上海','广州']} var Child = deepCopy(Parent);
以上三种方法的应用场景是非构造函数继承的一种方式
方法4:构造函数继承的复制
1. 对于任何对象,它可能的类型有Boolean
, Number
, Date
, String
, RegExp
, Array
以及 Object
(所有自定义的对象全都继承于Object
)
2. 我们必须保留对象的构造函数信息(从而使新对象可以使用定义在prototype
上的函数)
Object.prototype.clone = function () { var Constructor = this.constructor; var obj = new Constructor(); for (var attr in this) { if (this.hasOwnProperty(attr)) { if (typeof(this[attr]) !== "function") { if (this[attr] === null) { obj[attr] = null; } else { obj[attr] = this[attr].clone(); } } } } return obj; };
定义在Object.prototype
上的clone()
函数是整个方法的核心,对于任意一个非js预定义的对象,都会调用这个函数。而对于所有js预定义的对象,如Number
,Array
等,我们就要实现一个辅助clone()
函数来实现完整的克隆过程:
/* Method of Array*/ Array.prototype.clone = function () { var thisArr = this.valueOf(); var newArr = []; for (var i=0; i<thisArr.length; i++) { newArr.push(thisArr[i].clone()); } return newArr; }; /* Method of Boolean, Number, String*/ Boolean.prototype.clone = function() { return this.valueOf(); }; Number.prototype.clone = function() { return this.valueOf(); }; String.prototype.clone = function() { return this.valueOf(); }; /* Method of Date*/ Date.prototype.clone = function() { return new Date(this.valueOf()); }; /* Method of RegExp*/ RegExp.prototype.clone = function() { var pattern = this.valueOf(); var flags = ''; flags += pattern.global ? 'g' : ''; flags += pattern.ignoreCase ? 'i' : ''; flags += pattern.multiline ? 'm' : ''; return new RegExp(pattern.source, flags); };