美文网首页
【手撕代码3】js其他

【手撕代码3】js其他

作者: 一包 | 来源:发表于2019-04-03 17:01 被阅读0次
    • stringObject.split(separator,howmany)用于把一个字符串分割成字符串数组
    • toString() 方法可把一个 Number 对象转换为一个字符串,并返回结果;num.toString(2)能直接将num转换为2进制数格式的字符串
    • parseInt(string, radix) 可以将其它进制转换为十进制,第二个参数表明转换的数是什么进制
    • 数字转字符用toString(),字符转数字用parseInt() or parse(float)

    1. 请修复给定的 js 代码中,函数定义存在的问题

    原题:

    function functions(flag) {
        if (flag) {
          function getValue() { return 'a'; }
        } else {
          function getValue() { return 'b'; }
        }
    
        return getValue();
    }
    

    修复

    
    function functions(flag) {
       var getvalue=null;
        if (flag) {
          getValue = function(){ return 'a'; }
        } else {
          getValue = function() { return 'b'; }
        }
    
        return getValue();
    }
    
    • 这道题是考函数声明与函数表达式的区别,原题的写法,是在两个逻辑分支里面各有一个函数声明,但是对于函数声明,解析器会率先读取并且让其在执行任何代码前可用,意思就是别的代码还没运行呢,两个getValue声明已经被读取,所以总是执行最新的那个。函数表达式,当解析器执行到它所在的代码行时,才会真正被解释执行,所以两个逻辑分支可以分别执行

    2. 实现一个打点计时器,要求

    1. 从 start 到 end(包含 start 和 end),每隔 100 毫秒 console.log 一个数字,每次数字增幅为 1
    2. 返回的对象中需要包含一个 cancel 方法,用于停止定时操作
    3. 第一个数需要立即输出
    function count(start, end) {
        console.log(start++);
       
           var timer=setInterval(function(){
               if(start<=end){
                   console.log(start++);
               }else{
                   clearInterval(timer);
               }
            },100);
        return {
            cancel:function(){
                clearInterval(timer);
            }
        }
    }
    

    3. 实现 fizzBuzz 函数,参数 num 与返回值的关系如下:

    1. 如果 num 能同时被 3 和 5 整除,返回字符串 fizzbuzz
    2. 如果 num 能被 3 整除,返回字符串 fizz
    3. 如果 num 能被 5 整除,返回字符串 buzz
    4. 如果参数为空或者不是 Number 类型,返回 false
    5. 其余情况,返回参数 num
    function fizzBuzz(num) {
        if(!num||typeof num!="number") return false;
        
        var res="";
        if(num%3==0){
            res+="fizz"
        }
        if(num%5==0){
            res+="buzz"
        }
        return res?res:num;
    }
    

    4. (函数传参)将数组 arr 中的元素作为调用函数 fn 的参数

    function argsAsArray(fn, arr) {
        return fn.apply(this,arr);
    }
    

    5. (修改this)将函数 fn 的执行上下文改为 obj 对象

    • call/apply是直接调用目标函数,bind只是返回目标函数,并不调用,所以要用()执行函数
    
    //三种方案
    //apply
    function speak(fn, obj) {
        return fn.apply(obj);
    }
    //call
    function speak(fn, obj) {
        return fn.call(obj);
    }
    //bind
    function speak(fn, obj) {
        return fn.bind(obj)();
    }
    

    6. 实现函数 makeClosures,调用之后满足如下条件:

    1. 返回一个函数数组 result,长度与 arr 相同
    2. 运行 result 中第 i 个函数,即 resulti,结果与 fn(arr[i]) 相同
    function makeClosures(arr, fn) {
         var funArr=[];
        for(var i=0;i<arr.length;i++){
            (function(i){
                funArr[i]=function(){
                    return fn(arr[i]);
                } 
            })(i);
        }
        return funArr;
    }
    

    7.(二次封装)已知函数 fn 执行需要 3 个参数。请实现函数 partial,调用之后满足如下条件:

    1. 返回一个函数 result,该函数接受一个参数
    2. 执行 result(str3) ,返回的结果与 fn(str1, str2, str3) 一致
    function partial(fn, str1, str2) {
        function result(str3){
            return fn.call(this,str1,str2,str3);
        }
        return result;
    }
    

    8.(使用arguments)函数 useArguments 可以接收 1 个及以上的参数。请实现函数 useArguments,返回所有调用参数相加后的结果。本题的测试参数全部为 Number 类型,不需考虑参数转换

    function useArguments() {
      var argArr=[].slice.call(arguments);
       var sum=0;
        argArr.forEach(function(item){
            sum+=item;
        });
        return sum;
    }
    
    
    function useArguments() {
        var args = Array.prototype.slice.call(arguments, 0);
        return args.reduce(function(prev, curr, idx, arr) {
            return prev + curr;
        });
    }
    

    9.(使用apply)实现函数 callIt,调用之后满足如下条件

    1. 返回的结果为调用 fn 之后的结果
    2. fn 的调用参数为 callIt 的第一个参数之后的全部参数
    function callIt(fn) {
        var argArr=[].slice.call(arguments);
        var newArg=argArr.slice(1);
        return fn.apply(this,newArg);
    }
    

    10. 完成函数 createModule,调用之后满足如下要求:

    1. 返回一个对象
    2. 对象的 greeting 属性值等于 str1, name 属性值等于 str2
    3. 对象存在一个 sayIt 方法,该方法返回的字符串为 greeting属性值 + ', ' + name属性值
    function createModule(str1, str2) {
        function Object(){
            this.greeting=str1,
            this.name=str2
        }
        Object.prototype.sayIt=function(){
            return this.greeting+ ', ' +this.name;
        }
        return new Object;
    }
    
    
    
    function createModule(str1, str2) {
     var obj = {
            greeting:str1,
            name:str2,
            sayIt:function(){
                return this.greeting+', '+this.name;
            }
        }
        return obj;
    }
    

    11.修改 js 代码中 parseInt 的调用方式,使之通过全部测试用例

    • 输入'0x12',返回0
    //按10进制去处理字符串,碰到非数字字符,会将后面的全部无视
    function parse2Int(num) {
         return parseInt(num,10);
     }
    
    • parseFloat()只解析十进制
    function parse2Int(num) {
        return parseFloat(num);
    }
    
    
    
    function parse2Int(num) {
        var regex=/^\d+/;
        num=regex.exec(num)[0];
        return parseInt(num);
    }
    

    12. 获取数字 num 二进制形式第 bit 位的值。注意:

    1. bit 从 1 开始
    2. 返回 0 或 1
    3. 举例:2 的二进制为 10,第 1 位为 0,第 2 位为 1
    function valueAtBit(num, bit) {
        var s=num.toString(2);
        return s[s.length-bit];
    }
    
    function valueAtBit(num, bit) {
        var arr=num.toString(2).split("").reverse();
        return arr[bit-1];
       
    }
    

    13. 给定二进制字符串,将其换算成对应的十进制数字

    function base10(str) {
       return parseInt(str,2);
    }
    

    14. 将给定数字转换成二进制字符串。如果字符串长度不足 8 位,则在前面补 0 到满8位。

    function convertToBinary(num) {
        var s=num.toString(2);
        return "00000000".slice(s.length)+s;
    }
    

    15. 给定字符串 str,检查其是否包含连续重复的字母(a-zA-Z),包含返回 true,否则返回 false

    function containsRepeatingLetter(str) {
         return /([a-zA-Z])\1/.test(str);
    }
    

    15 给定字符串 str,检查其是否以元音字母结尾

    1.字母包括a,e,i,o,u,以及对应的大写

    1. 返回 true,否则返回 false
    function endsWithVowel(str) {
        return /[a,e,i,o,u]$/i.test(str);
    }
    

    16 柯里化求和

    function add(a){
      function s(b){
        a=a+b;
        return s;
      }
      s.toString=function(){
        return a;
      }
      return s;
    }
    console.log(add(1)(2)(3))
    

    相关文章

      网友评论

          本文标题:【手撕代码3】js其他

          本文链接:https://www.haomeiwen.com/subject/xnizbqtx.html