当前位置:首页 > 科技  > 软件

网易面试官:请你实现一下JS重载?可不是TS重载哦!

来源: 责编: 时间:2024-03-22 08:56:00 243观看
导读什么是重载我第一次看到重载这个词还是在以前学习Java的时候,我一直觉得JavaScript是没有重载的,直到TypeScript的出现,所以我一直觉得JavaScript没有重载,TypeScript才有,但是现在看来我是错的。我理解的重载是:同样的函数

什么是重载

我第一次看到重载这个词还是在以前学习Java的时候,我一直觉得JavaScript是没有重载的,直到TypeScript的出现,所以我一直觉得JavaScript没有重载,TypeScript才有,但是现在看来我是错的。vas28资讯网——每日最新资讯28at.com

我理解的重载是:同样的函数,不同样的参数个数,执行不同的代码,比如:vas28资讯网——每日最新资讯28at.com

/** 重载*/function fn(name) {  console.log(`我是${name}`)}function fn(name, age) {  console.log(`我是${name},今年${age}岁`)}function fn(name, age, sport) {  console.log(`我是${name},今年${age}岁,喜欢运动是${sport}`)}/** 理想结果*/fn('林三心') // 我是林三心fn('林三心', 18) // 我是林三心,今年18岁fn('林三心', 18, '打篮球') // 我是林三心,今年18岁,喜欢运动是打篮球

但是直接在JavaScript中这么写,肯定是不行的,咱们来看看上面代码的实际执行结果,可以看到,最后一个fn的定义,把前面两个都给覆盖了,所以没有实现重载的效果。vas28资讯网——每日最新资讯28at.com

我是林三心,今年undefined岁,喜欢运动是undefined我是林三心,今年18岁,喜欢运动是undefined我是林三心,今年18岁,喜欢运动是打篮球

我的做法

其实,想要实现理想的重载效果,我还是有办法的,我可以只写一个fn函数,并在这个函数中判断arguments类数组的长度,执行不同的代码,就可以完成重载的效果。vas28资讯网——每日最新资讯28at.com

function fn() {  switch (arguments.length) {    case 1:      var [name] = arguments      console.log(`我是${name}`)      break;    case 2:      var [name, age] = arguments      console.log(`我是${name},今年${age}岁`)      break;    case 3:      var [name, age, sport] = arguments      console.log(`我是${name},今年${age}岁,喜欢运动是${sport}`)      break;  }}/** 实现效果*/fn('林三心') // 我是林三心fn('林三心', 18) // 我是林三心,今年18岁fn('林三心', 18, '打篮球') // 我是林三心,今年18岁,喜欢运动是打篮球

但是那位同学说,网易的面试官好像觉得这么实现可以是可以,但是还有没有更好的实现方法,我就懵逼了。vas28资讯网——每日最新资讯28at.com

高端做法

经过了我的一通网上查找资料,发现了一种比较高端的做法,可以利用闭包来实现重载的效果。这个方法在JQuery之父John Resig写的《secrets of the JavaScript ninja》中,这种方法充分的利用了闭包的特性!vas28资讯网——每日最新资讯28at.com

function addMethod(object, name, fn) {  var old = object[name]; //把前一次添加的方法存在一个临时变量old里面  object[name] = function () { // 重写了object[name]的方法    // 如果调用object[name]方法时,传入的参数个数跟预期的一致,则直接调用    if (fn.length === arguments.length) {      return fn.apply(this, arguments);      // 否则,判断old是否是函数,如果是,就调用old    } else if (typeof old === "function") {      return old.apply(this, arguments);    }  }}addMethod(window, 'fn', (name) => console.log(`我是${name}`))addMethod(window, 'fn', (name, age) => console.log(`我是${name},今年${age}岁`))addMethod(window, 'fn', (name, age, sport) => console.log(`我是${name},今年${age}岁,喜欢运动是${sport}`))/** 实现效果*/window.fn('林三心') // 我是林三心window.fn('林三心', 18) // 我是林三心,今年18岁window.fn('林三心', 18, '打篮球') // 我是林三心,今年18岁,喜欢运动是打篮球

参考资料

  • 浅谈JavaScript函数重载

本文链接:http://www.28at.com/showinfo-26-78507-0.html网易面试官:请你实现一下JS重载?可不是TS重载哦!

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 瘫痪8年小哥植入马斯克脑机接口,狂打8小时「文明6」!Neuralink首个人类植入者直播来了

下一篇: Excel数据处理利器:C#中三款热门开源类库推荐及实例代码解析

标签:
  • 热门焦点
  • 8月总票房已突破10亿!《封神》第一:口碑已经成了

    8月5日消息,据灯塔专业版数据,截至8月5日9时35分,8月总票房(含预售)已突破10亿。其中,《封神》以大比分的优势领先。根据官方消息,目前该片总票房已经超过14.
  • K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 只需五步,使用start.spring.io快速入门Spring编程

    步骤1打开https://start.spring.io/,按照屏幕截图中的内容创建项目,添加 Spring Web 依赖项,并单击“生成”按钮下载 .zip 文件,为下一步做准备。请在进入步骤2之前进行解压。图
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 讲故事上个月我写过一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,当时用的是 GDIView + WinDbg 把问题搞定,前者用来定位泄露资源,后者用来定位泄露代码,后面有朋友反
  • 零售大模型“干中学”,攀爬数字化珠峰

    文/侯煜编辑/cc来源/华尔街科技眼对于绝大多数登山爱好者而言,攀爬珠穆朗玛峰可谓终极目标。攀登珠峰的商业路线有两条,一是尼泊尔境内的南坡路线,一是中国境内的北坡路线。相
  • 重估百度丨“晚熟”的百度云,能等到春天吗?

    ©自象限原创作者|程心排版|王喻可2016年7月13日,百度云计算战略发布会在北京举行,宣告着百度智能云的正式启程。彼时的会场座无虚席,甚至排队排到了门外,在场的所有人几乎都
  • 小米公益基金会捐赠2500万元驰援北京、河北暴雨救灾

    8月2日消息,今日小米科技创始人雷军在其微博上发布消息称,小米公益基金会宣布捐赠2500万元驰援北京、河北暴雨救灾。携手抗灾,京冀安康!以下为公告原文
  • 消息称小米汽车开始筛选交付中心:需至少120个车位

    IT之家 7 月 7 日消息,日前,有微博简介为“汽车行业从业者、长三角一体化拥护者”的微博用户 @长三角行健者 发文表示,据经销商集团反馈,小米汽车目前
  • 上海举办人工智能大会活动,建设人工智能新高地

    人工智能大会在上海浦江两岸隆重拉开帷幕,人工智能新技术、新产品、新应用、新理念集中亮相。8月30日晚,作为大会的特色活动之一的上海人工智能发展盛典人工
Top