常见前端面试题
2021-03-15 本文已影响0人
无穷369
箭头函数与普通函数的区别
- 箭头函数语法比普通函数更加简洁,但箭头函数中没有arguments,所以形参可以使用展开运算符 (...args) => {console.log(args)}获取
- 箭头函数没有自己的this,他的this事继承函数所处上下文中的this,使用call,apply等任何方式都无法改变this的指向
- 箭头函数不能被new执行,因为箭头函数没有prototype
如何把一个字符串的大小写取反
小转大 toUpperCase()
大转小 toLowerCase()
let str = 'AbC'
str = str.replace(/[a-zA-Z]/g,content => {
return content.toUpperCase() === content ? content.toLowerCase() : content.toUpperCase()
})
数组扁平化
let arr = [1,[2,[3,5]],4]
arr.flat(Infinity)
// [1,2,3,5,4]
手写一个new
function _new(Fn,...args){
// 创建一个空对象,让他的原型链指向Fn.prototype
let obj = {}
obj.__proto__ = Fn.prototype
// 也可以使用下面这一行代码完成上面的两步操作
let obj = Object.create(Fn.prototype)
Fn.call(obj,...args)
return obj
}
对象调用push
let obj = {
2: 3,
3: 4,
length: 2,
push: Array.prototype.push
}
obj.push(1)
obj.push(2)
console.log(obj)
旋转数组
function rotate(k){
if (k < 0 || k === 0 || k === this.length) return this
if (k > this.length) k = k % this.length
return this.slice(-k).concat(this.slice(0,this.length-k))
}
Array.prototype.rotate = rotate
let arr = [1,2,3,4,5,6,7]
arr.rotate(3)
手写一个bind
~function(){
function myBind(context = window,...outerArg){
let that = this
return function(...innerArg){
that.call(context,...outerArg.concat(innerArg))
}
}
Function.prototype.myBind = myBind
}()
function fn(...args){
console.log(this,args)
}
document.body.onclick = fn.myBind(obj,100,200)
函数柯理化,请实现一个add函数,满足以下功能
add(1) // 1
add(1)(2) // 3
add(1)(2)(3) // 6
add().....()
add(1)(2,3) // 6
add(1,2)(3) // 6
add(1,2,3)
function currying(fn,length){
length = length || fn.length
return function(...args){
if(args.length >= length){
return fn(...args)
}
return currying(fn.bind(null,...args),length - args.length)
}
}
function add(n1,n2,n3){
return n1 + n2 + n3
}
add = currying(add,3)