打工仔的周末,不妨来点前端知识! 面试官问你JS是如何实现函数重载的?你会怎么回答? 你会不会疑问我在书里看的明确讲JS是没有函数重载的,面试官说能实现,那肯定是有办法的呀,该如何实现呢?一、什么是函数重载? 重载函数指的是两个或两个以上的同名函数,实现一个函数名有多种功能。 函数重载要求编译器能够在调用函数时唯一确定,应该调用的是哪个函数?由于同名函数有多个,在确定函数实现时,需要根据函数的参数的个数和类型来区分,即实现函数重载时,要求同名函数的参数个数或类型不一致,否则将无法实现函数重载。 重载的特点:同名的多个函数。不同的参数。二、JS中有函数重载吗? 我在阅读《JavaScript高级程序设计(第三版)》一书,在第五章看到明确的提示JS没有函数重载。 我们在《JavaScript高级程序设计(第三版)》书中能看到,JS中的同名函数,前面的会被最后面的函数覆盖掉,根本无法实现多种功能,如:functionadd(a,b){returnab}functionadd(a,b,c){returnabc}console。log(add(1,2));NaNconsole。log(add(1,2,3));6 如果我们需要使用JS实现上述add方法,将两个或三个数值进行求和,该怎么解决呢? 解决1:利用argumentsfunctionadd(){if(reg。length2){returnreg〔0〕reg〔1〕}elseif(reg。length3){returnreg〔0〕reg〔1〕reg〔2〕}}console。log(add(1,2))3console。log(add(1,2,3))6 上述方法虽然实现了上述简单功能,勉强能算得上是一种函数重载的实现方法,但是存在一定的弊端。 它的缺点:如果功能复杂时,代码量过大。不利于维护和复用。 这时候问题来了,利用JS如何实现呢?可以通过闭包的形式可以简单地实现。三、JS如何实现重载?functionaddMethodToObject(obj,name,fn){consttempobj〔name〕obj〔name〕function(){if(fn。lengtharguments。length){returnfn。apply(obj,arguments)}elseif(typeoftempfunction){returntemp。apply(obj,arguments)}}} 上述方法用来给一个对象添加自定义方法,能够接收三个参数:需要添加方法的对象自定义方法名定义方法具体要实现的功能,通过回调实现addMethodToObject(group,find,function(){return{peoples:this。peoples,count:this。peoples。length}})addMethodToObject(group,find,function(isMale){if(!!isMale){constmalethis。peoples。filter(itemitem。sexmale)return{peoples:male,count:male。length}}else{constfemalethis。peoples。filter(itemitem。sexfemale)return{peoples:female,count:female。length}}})addMethodToObject(group,find,function(elder,age){if(!!elder){constelderthis。peoples。filter(itemitem。ageage)return{peoples:elder,count:elder。length}}else{constyoungerthis。peoples。filter(itemitem。ageage)return{peoples:younger,count:younger。length}}})constgroup{total:10,male:6,female:4,peoples:〔{age:12,sex:male},{age:18,sex:female}〕}group。find()group。find(1)group。find(0,15) 总结:JS没有函数重载,但是可以实现函数重载