zoukankan      html  css  js  c++  java
  • 前端面试题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 = /(?=(?!)(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);
    };

      

  • 相关阅读:
    选择本地照片之后即显示在Img中(客户体验)
    解决JQuery.ajax.post乱码问题
    浅析MVC模式与三层架构的区别01
    照片上传(缩略图实现)
    基于Netty的聊天系统(三)协议定制----消息篇
    基于Netty的聊天系统(二)协议定制----登录篇
    基于Netty的聊天系统(一)通讯原理篇
    Centos6.5下配置SVN服务器
    FreeMarker-TemplateLoader
    移动UI自动化-Page Objects Pattern
  • 原文地址:https://www.cnblogs.com/littlewriter/p/6926512.html
Copyright © 2011-2022 走看看