箭頭函數(shù)與普通函數(shù)的區(qū)別
- 箭頭函數(shù)語法比普通函數(shù)更加簡潔,但箭頭函數(shù)中沒有arguments,所以形參可以使用展開運(yùn)算符 (...args) => {console.log(args)}獲取
- 箭頭函數(shù)沒有自己的this,他的this事繼承函數(shù)所處上下文中的this,使用call,apply等任何方式都無法改變this的指向
- 箭頭函數(shù)不能被new執(zhí)行,因?yàn)榧^函數(shù)沒有prototype
如何把一個(gè)字符串的大小寫取反
小轉(zhuǎn)大 toUpperCase()
大轉(zhuǎn)小 toLowerCase()
let str = 'AbC'
str = str.replace(/[a-zA-Z]/g,content => {
return content.toUpperCase() === content ? content.toLowerCase() : content.toUpperCase()
})
數(shù)組扁平化
let arr = [1,[2,[3,5]],4]
arr.flat(Infinity)
// [1,2,3,5,4]
手寫一個(gè)new
function _new(Fn,...args){
// 創(chuàng)建一個(gè)空對象,讓他的原型鏈指向Fn.prototype
let obj = {}
obj.__proto__ = Fn.prototype
// 也可以使用下面這一行代碼完成上面的兩步操作
let obj = Object.create(Fn.prototype)
Fn.call(obj,...args)
return obj
}
對象調(diào)用push
let obj = {
2: 3,
3: 4,
length: 2,
push: Array.prototype.push
}
obj.push(1)
obj.push(2)
console.log(obj)
旋轉(zhuǎn)數(shù)組
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)
手寫一個(gè)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)
函數(shù)柯理化,請實(shí)現(xiàn)一個(gè)add函數(shù),滿足以下功能
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)