引言前端
牛客网这个前端笔试题库,能够说这60道是最基础的了,也是考察的东西比较杂,有时间4天差很少就能够刷完,巩固基础仍是有些用的。作完题回顾一上午就能够过完一遍。如今我结合个人答案和参考的其余人的答案,在这里作一个总结,也是本身知识的整理结果。数组
题目描述
请修复给定的 js 代码中,函数定义存在的问题 输入:true
输出:amarkdownfunction 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
题目描述
修改 js 代码中 parseInt 的调用方式,使之经过所有测试用例
输入:'12' 输出:12
输入: '12px' 输出:12
输入: '0x12' 输出:0函数
// 方法,肯定是10进制
function parse2Int(num) {
return parseInt(num,10);
}
复制代码
相关知识点:oop
parseInt常常用于强制类型转换中显式转换成数字,接收两个参数,返回数值或者NaNpost
parseInt(string, radix)
第一个参数是字符串,必须传的。
第二个参数是数字的基数,2-36,若是不传或者传0都是以10位基数来计算,若是小于2(不等于0)或者大于36一概返回NaN,若是'0x'开头为16进制,'0'开头不包括0是8进制。测试parseInt强制类型转化的时候,若是第一位不是数字就会返回NaN,若是第一位是数字,那么会把后面是数字的返回,不是数字的过滤掉。若是是小数的话,会向下取整成整数。
题目描述
判断 val1 和 val2 是否彻底等同
function identity(val1, val2) {
return val1 === val2
}
复制代码
相关知识点:
== 和 === 的区别,简单来讲在于,== 只判断值相同,遇到问题,=== 还要判断类型是否相同。 这里其实我以为还须要考虑NaN的问题,NaN !== NaN
题目描述
实现一个打点计时器,要求
- 从 start 到 end(包含 start 和 end),每隔 100 毫秒 console.log 一个数字,每次数字增幅为 1
- 返回的对象中须要包含一个 cancel 方法,用于中止定时操做
- 第一个数须要当即输出
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)
}
}
}
复制代码
相关知识点:
计时器,若是第一个要当即输出,那么须要手动写一次。
定义的时候接收两个参数,第一个是每次执行的函数,第二个是执行时间间隔。
返回值接收计时器名称,能够用于清空计时器用。
题目描述
实现 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
}
}
复制代码
相关知识点:
isNaN(),遇到不是Number类型的判断都用这个函数,若是参数不是数字就返回true,其余的判断我以为都不是这个题要考的。ES6以后新增了方法Number.isNaN() 判断是不是NaN
题目描述
将数组 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)()
}
复制代码
相关知识点:
题目描述
将函数 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)()
}
复制代码
相关知识点:
apply/call/bind 均可以修改执行上下文,若是直接调用fn,this指的是window,若是用 apply/call/bind 能够将this改为对象obj
题目描述
实现函数 functionFunction,调用以后知足以下条件:
一、返回值为一个函数 f
二、调用返回的函数 f,返回值为按照调用顺序的参数拼接,拼接字符为英文逗号加一个空格,即 ', '
三、全部函数的参数数量为 1,且均为 String 类型
输入:
functionFunction('Hello')('world')
输出: Hello, world
function functionFunction(str) {
return function f(...arg) {
// 记得逗号以后要加一个空格,才能过oj
return str + ', '+arg
}
}
复制代码
相关知识点:
闭包是一个函数能够访问另外一个函数做用域的变量。
题目描述
实现函数 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值。
题目描述
已知函数 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.length
获取元素用数组下标arguments[0]
获取当前执行的函数 arguments.callee (ES5严格模式下禁用)
后面的东西可能会上一些小难度~~~