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

目录

  • 引言

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

引言

牛客网这个前端笔试题库,可以说这60道是最基础的了,也是考察的东西比较杂,有时间4天差不多就可以刷完,巩固基础还是有些用的。做完题回顾一上午就可以过完一遍。现在我结合我的答案和参考的其他人的答案,在这里做一个总结,也是自己知识的整理结果。

31. 正确的函数定义

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

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。

函数表达式:使用函数表达式,还是会进行变量的提升,只不过这次提升的是变量getValue,在执行的时候,才会根据if语句的流程控制执行不同的函数。

31. 正确的使用 parseInt

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

// 方法,确定是10进制
function parse2Int(num) {
    return parseInt(num,10);
}

相关知识点:

  • parseInt

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

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

31. 正确的函数定义

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

  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

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

  • 闭包

31. 流程控制

题目描述
实现 fizzBuzz 函数,参数 num 与返回值的关系如下:
1、如果 num 能同时被 3 和 5 整除,返回字符串 fizzbuzz
2、如果 num 能被 3 整除,返回字符串 fizz
3、如果 num 能被 5 整除,返回字符串 buzz
4、如果参数为空或者不是 Number 类型,返回 false
5、其余情况,返回参数 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,调用之后满足如下条件:
1、返回值为一个函数 f
2、调用返回的函数 f,返回值为按照调用顺序的参数拼接,拼接字符为英文逗号加一个空格,即 ', '
3、所有函数的参数数量为 1,且均为 String 类型
输入:
functionFunction('Hello')('world')
输出: Hello, world

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

相关知识点:

  • 闭包 + 柯里化

闭包的作用是一个函数可以访问另一个函数作用域的变量。

39. 使用闭包

题目描述
实现函数 makeClosures,调用之后满足如下条件:
1、返回一个函数数组 result,长度与 arr 相同
2、运行 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,调用之后满足如下条件:
1、返回一个函数 result,该函数接受一个参数
2、执行 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严格模式下禁用)

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容