前端面试题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. 对于任何对象,它可能的类型有BooleanNumberDateStringRegExpArray 以及 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);
};

 

 

 

 

 

  

posted @ 2017-06-01 00:21  行动派  阅读(240)  评论(0编辑  收藏  举报