【手撕代码3】js其他

2019-04-03  本文已影响0人  一包

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();
}

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 对象


//三种方案
//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 的调用方式,使之通过全部测试用例

//按10进制去处理字符串,碰到非数字字符,会将后面的全部无视
function parse2Int(num) {
     return parseInt(num,10);
 }
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))
上一篇下一篇

猜你喜欢

热点阅读