前端刷题 —— 牛客网前端题库60道详解(四)

目录

  • 引言前端

    1. 正确的函数定义 (简单)
    2. 正确的使用 parseInt (入门)
    3. 彻底等同 (入门)
    4. 计时器 (中等)
    5. 流程控制 (中等)
    6. 函数传参 (入门)
    7. 函数的上下文 (入门)
    8. 返回函数 (简单)
    9. 使用闭包 (中等)
    10. 二次封装函数 (入门)

引言

牛客网这个前端笔试题库,能够说这60道是最基础的了,也是考察的东西比较杂,有时间4天差很少就能够刷完,巩固基础仍是有些用的。作完题回顾一上午就能够过完一遍。如今我结合个人答案和参考的其余人的答案,在这里作一个总结,也是本身知识的整理结果。数组

31. 正确的函数定义

题目描述
请修复给定的 js 代码中,函数定义存在的问题 输入:true
输出:amarkdown

function functions(flag) {
    if (flag) {
      function getValue() { return 'a'; }
    } else {
      function getValue() { return 'b'; }
    }
    return getValue();
}
复制代码
// 方法一:使用函数表达式
function functions(flag) {
    if (flag) {
      var getValue = () => { return 'a'; }
    } else {
      var getValue = () => { return 'b'; }
    }
 
    return getValue();
}

// 上面的等同于下面的,变量提高
function functions(flag) {
    var getValue
    if (flag) {
      getValue = () => { return 'a'; }
    } else {
      getValue = () => { return 'b'; }
    }

    return getValue();
}
复制代码

相关知识点:闭包

  • 函数的定义方式

函数声明式:函数声明在函数没有执行以前就已经在做用域中会提高,同名的声明会进行覆盖,如下面的为准,那么程序执行的时候一直输出的就是b。app

函数表达式:使用函数表达式,仍是会进行变量的提高,只不过此次提高的是变量getValue,在执行的时候,才会根据if语句的流程控制执行不一样的函数。ide

32. 正确的使用 parseInt

题目描述
修改 js 代码中 parseInt 的调用方式,使之经过所有测试用例
输入:'12' 输出:12
输入: '12px' 输出:12
输入: '0x12' 输出:0函数

// 方法,肯定是10进制
function parse2Int(num) {
    return parseInt(num,10);
}
复制代码

相关知识点:oop

  • parseInt

parseInt常常用于强制类型转换中显式转换成数字,接收两个参数,返回数值或者NaNpost

parseInt(string, radix)
第一个参数是字符串,必须传的。
第二个参数是数字的基数,2-36,若是不传或者传0都是以10位基数来计算,若是小于2(不等于0)或者大于36一概返回NaN,若是'0x'开头为16进制,'0'开头不包括0是8进制。测试

parseInt强制类型转化的时候,若是第一位不是数字就会返回NaN,若是第一位是数字,那么会把后面是数字的返回,不是数字的过滤掉。若是是小数的话,会向下取整成整数。

33. 彻底等同

题目描述
判断 val1 和 val2 是否彻底等同

function identity(val1, val2) {
     return val1 === val2
}
复制代码

相关知识点:

  • 等同

== 和 === 的区别,简单来讲在于,== 只判断值相同,遇到问题,=== 还要判断类型是否相同。 这里其实我以为还须要考虑NaN的问题,NaN !== NaN

34. 正确的函数定义

题目描述
实现一个打点计时器,要求

  1. 从 start 到 end(包含 start 和 end),每隔 100 毫秒 console.log 一个数字,每次数字增幅为 1
  2. 返回的对象中须要包含一个 cancel 方法,用于中止定时操做
  3. 第一个数须要当即输出
function count(start, end) {
    // 第一个当即输出
    console.log(start++)
    let time = setInterval(function () {
        if(start >= end) clearInterval(time)
        console.log(start++)
    },100)
    return {
        // 返回的方法是一个函数
        cancel: function () {
            clearInterval(time)
        }
    }
}
复制代码

相关知识点:

  • setInterval

计时器,若是第一个要当即输出,那么须要手动写一次。
定义的时候接收两个参数,第一个是每次执行的函数,第二个是执行时间间隔。
返回值接收计时器名称,能够用于清空计时器用。

  • 闭包

35. 流程控制

题目描述
实现 fizzBuzz 函数,参数 num 与返回值的关系以下:
一、若是 num 能同时被 3 和 5 整除,返回字符串 fizzbuzz
二、若是 num 能被 3 整除,返回字符串 fizz
三、若是 num 能被 5 整除,返回字符串 buzz
四、若是参数为空或者不是 Number 类型,返回 false
五、其他状况,返回参数 num 输入: 15 ; 输出: fizzbuzz

function fizzBuzz(num) {
    // 若是num为空或者不传,isNaN都为true
    if(isNaN(num)) return false
    if(num % 3 === 0 && num % 5 === 0) {
        return 'fizzbuzz'
    } else if (num % 3 === 0) {
        return 'fizz'
    } else if (num % 5 === 0) {
        return 'buzz'
    } else {
        return num
    }
}
复制代码

相关知识点:

  • 流程控制:if-else
  • isNaN

isNaN(),遇到不是Number类型的判断都用这个函数,若是参数不是数字就返回true,其余的判断我以为都不是这个题要考的。ES6以后新增了方法Number.isNaN() 判断是不是NaN

  • 取余 %

36. 函数传参

题目描述
将数组 arr 中的元素做为调用函数 fn 的参数 输入:
function (greeting, name, punctuation) {return greeting + ', ' + name + (punctuation || '!');}, ['Hello', 'Ellie', '!']
输出:
Hello, Ellie!

// 方法一:量身定作,传的是数组
function argsAsArray(fn, arr) {
    return fn.apply(this,arr)
}

// 方法二:若是用call就须要使用扩展符打散
function argsAsArray(fn, arr) {
    return fn.call(this,...arr)
}

// 方法三:若是bind处理
function argsAsArray(fn, arr) {
    return fn.bind(this,...arr)()
}
复制代码

相关知识点:

  • apply/call/bind (详情见一的第一题)
  • fn传参问题

37. 函数的上下文

题目描述
将函数 fn 的执行上下文改成 obj 对象 输入:
function () {return this.greeting + ', ' + this.name + '!!!';}, {greeting: 'Hello', name: 'Rebecca'}
输出:Hello, Rebecca!!!

// 方法一: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)()
}
复制代码

相关知识点:

  • this指向

apply/call/bind 均可以修改执行上下文,若是直接调用fn,this指的是window,若是用 apply/call/bind 能够将this改为对象obj

38. 返回函数

题目描述
实现函数 functionFunction,调用以后知足以下条件:
一、返回值为一个函数 f
二、调用返回的函数 f,返回值为按照调用顺序的参数拼接,拼接字符为英文逗号加一个空格,即 ', '
三、全部函数的参数数量为 1,且均为 String 类型
输入:
functionFunction('Hello')('world')
输出: Hello, world

function functionFunction(str) {
    return function f(...arg) {
        // 记得逗号以后要加一个空格,才能过oj
        return str + ', '+arg
    }
}
复制代码

相关知识点:

  • 闭包 + 柯里化

闭包是一个函数能够访问另外一个函数做用域的变量。

39. 使用闭包

题目描述
实现函数 makeClosures,调用以后知足以下条件:
一、返回一个函数数组 result,长度与 arr 相同
二、运行 result 中第 i 个函数,即 result[i](),结果与 fn(arr[i]) 相同
输入:

[1, 2, 3], function (x) { 
	return x * x; 
}
复制代码

输出:4

// 闭包
function makeClosures(arr, fn) {
    let result = []
    for(let i = 0; i < arr.length; i++) {
        result.push(function(){
          return fn(arr[i])  
        })
    }
    return result
}
复制代码

相关知识点:

  • 闭包

上面的题,若是不用闭包,那么for循环的嘶吼,最后调用函数的时候,i都是arr.length,若是使用闭包,能够是当时循环的i值。

40. 二次封装函数

题目描述
已知函数 fn 执行须要 3 个参数。请实现函数 partial,调用以后知足以下条件:
一、返回一个函数 result,该函数接受一个参数
二、执行 result(str3) ,返回的结果与 fn(str1, str2, str3) 一致
输入:
var sayIt = function(greeting, name, punctuation) { return greeting + ', ' + name + (punctuation || '!'); }; partial(sayIt, 'Hello', 'Ellie')('!!!');

输出:Hello, Ellie!!!

// 方法一:直接调用,由于没有涉及到this,这里直接用arguments来获取,由于arguments是类数组
function partial(fn, str1, str2) {
    return function result() {
        return fn(str1,str2,arguments[0])
    }
}

// 方法二:用扩展运算符拿到参数传入,更加的通用
function partial(fn, str1, str2) {
    return function result(...arg) {
        return fn(str1,str2,arg)
    }
}

// 方法二:ES6箭头函数,this指的是undefined
const partial = (fn, str1, str2) => str3 => fn(str1, str2, str3)
复制代码

相关知识点:

  • 闭包
  • 获取函数参数arguments

arguments 类数组,
获取长度arguments.length
获取元素用数组下标arguments[0]
获取当前执行的函数 arguments.callee (ES5严格模式下禁用)

后面的东西可能会上一些小难度~~~

相关文章
相关标签/搜索