Sunly

Web前端的学习之旅


  • 首页

  • 分类

  • 归档

  • 标签

2017笔试总结

发表于 2017-04-14   |   分类于 笔试   |  
  1. 每个一秒输出一个值;闭包和setTimeOut函数

    for (var i = 0; i < 5; i++) {
        window.setTimeout(function(j){
            return function(){
                console.log(j);
            }
        }(i),1000);
    }
    

    注意:对i值的引用,console的应该是传入的字符copy的j值;否则最后调用i的时候都会是5;
    用函数对事件函数进行封装,这样每一个函数和传入的i都拥有自己独立的作用域,所以每个i都是不一样的。

  2. 考察对象属性名的基本定义,对象自动转换成字符串

    var a = {};
    var b = {key:'b'};
    var c = {key:'c'};
    a[b] = 123;
    a[c] = 456;
    console.log(a[b]);
    
    //输出应该是 456
    

    js的对象属性值是字符串,如果你定义的name不是字符串,就会调用这个name的toString() 方法变成字符串来计算;

    b.toString() // "[object Object]"
    a  // {[object Object]: "123"}
    
  1. 考察基本闭包: 处输出值是?

    var func = function(){
        var secret = 'secret';
        return {
            get_secret: function(){
                return secret;
            },
            change_secret: function(new_secret){
                secret = new_secret;
            }
        };
    };
    var test = func();
    
    console.warn(test.get_secret());
    console.warn(test.secret);
    console.warn(test.change_secret("a new secret"));
    console.warn(test.get_secret());
    
    //secret
    //undefined
    //undefined
    //a new secret
    

    第三个应该是输出undefined,而不是什么都不输出,因为在js中,一个函数总会返回一个值,如果没有指定返回值,则返回undefined。

  2. 考察数组去重,但不能够自动转换类型;

    var noRepeat = function(oArr){
        var aArr = [];
        for (var i = 0; i < oArr.length; i++) {
            var isIn = false;
            for (var j = 0; j < aArr.length; j++) {
                if (aArr[j]===oArr[i]) {
                    isIn = true;
                    break;
                }
            }
            if (!isIn) {
                aArr.push(oArr[i]);
            }
        }
        return aArr;
    };
    
    var originArr = [0,1,2,3,'1','3','4','3',0,3,3,2,4];
    var afterArr = noRepeat(originArr);
    console.log(afterArr);
    

    基本方法是定义一个新的数组,遍历原数组,对于原数组中的每个值,遍历新数组,当新数组中有值时,将布尔值isIn设为true,并跳出内层循环,若isIn没有变还是false,就在新数组中添加当前元素值。最后返回新数组;

  3. 考察字符串知识

    var s1 = 'youareindeedalovelygirliloveyousomuch';
    var s2 = 'arechmusoyouelovilgirclovlyeaineeddyou';
    var findAn = function(s1,s2){
        sArr1 = s1.split('');
        sArr2 = s2.split('');
        sArr1.sort();
        sArr2.sort();
        for (var i = 0; i < sArr1.length; i++) {
            if (sArr1[i]!==sArr2[i]) {
                return sArr2[i];
            }
        }
        return sArr2[sArr2.length-1];
    };
    var chara = findAn(s1, s2);
    console.log(chara);
    

    先使用字符串的split方法将字符串变为数组,然后用sort方法进行排序,排序之后判断对应位置的字符,若不相等,则s2的当前字符就是多余的;

  4. 查找字符串中出现的最多的字符和个数

    var searchMChar = function(str){
        var obj = {};
    
        for (var i = 0; i < str.length; i++) {
            obj[str[i]] = obj[str[i]]===undefined?1:obj[str[i]]+1;
        }
        console.log(obj);
        var maxCount = obj[str[0]];
        var maxName = str[0];
        for(var c in obj){
            if (obj[c]>maxCount) {
                maxCount = obj[c];
                maxName = c;
            }
        }
        return {
            maxCount: maxCount,
            maxName: maxName
        };
    };
    var str = "she's a lovely lovely girl!";
    var obj = searchMChar(str);
    console.log(obj);
    

    使用一个对象来保存每个字符和对应出现的次数;注意在对象存执的时候是可以直接根据属性名获取相应的属性值,不用判断属性名和当前字符相等时才进行操作。。。
    另外,属性没有时,其值为undefined。
    另外,还可以使用正则的方式来计算:

    var searchMChar = function (str){
        var num=0;
        var value=null;
        var new_str=str.split("").sort().join("");//得到排序后的新的字符串
        var re=/(\w)\1+/g;  //只匹配字符               
        //没有\1,re就是一整个排好序的字符串
        //有了\1就是出现过的有重复的取出来,\1表示跟前面第一个子项是相同的
        //捕获组
        new_str.replace(re,function($0,$1){    
        //$0代表取出来重复的一个个整体,如[s,s...],[f,f..],[d,d....]  
        //$1代表这个整体里的字符
            console.log($0,$1);
            if(num<$0.length){
                num=$0.length;
                value=$1;
            }
        });
        return {
            maxCount: num,
            maxName: value
        };
    };
    var str = "she's a lovely lovely girl!";
    var obj = searchMChar(str);
    console.log(obj);
    

    在字符串的匹配方法中,有一个replace方法,它的第二个参数可以是函数,函数的参数是如下定义的:
    当没有捕获组的时候,函数有三个参数:模式的匹配项、模式匹配项子字符串中的位置、原字符串
    当有捕获组的时候,函数的第二个参数以及之后分别是对应的捕获组,模式匹配项子字符串中的位置、原字符串是最后两个参数。
    正则每匹配一个字符串的项,就会传入函数中进行处理;

以上一些算法是对字符串和数组的操作等,但是大多没有考虑到算法优化的问题。

参考资料:
【1】 Js练习题之查找字符串中出现最多的字符和个数 http://www.cnblogs.com/zhangwenkan/p/4206208.html

1…121314…21
孙丽莹

孙丽莹

点点滴滴的Web前端的学习历程

21 日志
12 分类
16 标签
© 2017 孙丽莹
由 Hexo 强力驱动
主题 - NexT.Mist