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

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

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

什么是重载

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

我理解的重载是:同样的函数,不同样的参数个数,执行不同的代码,比如:0eh28资讯网——每日最新资讯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的定义,把前面两个都给覆盖了,所以没有实现重载的效果。0eh28资讯网——每日最新资讯28at.com

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

我的做法

其实,想要实现理想的重载效果,我还是有办法的,我可以只写一个fn函数,并在这个函数中判断arguments类数组的长度,执行不同的代码,就可以完成重载的效果。0eh28资讯网——每日最新资讯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岁,喜欢运动是打篮球

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

高端做法

经过了我的一通网上查找资料,发现了一种比较高端的做法,可以利用闭包来实现重载的效果。这个方法在JQuery之父John Resig写的《secrets of the JavaScript ninja》中,这种方法充分的利用了闭包的特性!0eh28资讯网——每日最新资讯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#中三款热门开源类库推荐及实例代码解析

标签:
  • 热门焦点
  • 直屏旗舰来了 iQOO 12和K70 Pro同台竞技

    旗舰机基本上使用的都是双曲面屏幕,这就让很多喜欢直屏的爱好者在苦等一款直屏旗舰,这次,你们等到了。据博主数码闲聊站带来的最新爆料称,Redmi下代旗舰K70 Pro和iQOO 12两款手
  • 三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • 一篇聊聊Go错误封装机制

    %w 是用于错误包装(Error Wrapping)的格式化动词。它是用于 fmt.Errorf 和 fmt.Sprintf 函数中的一个特殊格式化动词,用于将一个错误(或其他可打印的值)包装在一个新的错误中。使
  • 自动化在DevOps中的力量:简化软件开发和交付

    自动化在DevOps中扮演着重要角色,它提升了DevOps的效能。通过自动化工具和方法,DevOps团队可以实现以下目标:消除手动和重复性任务。简化流程。在整个软件开发生命周期中实现更
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 共享单车的故事讲到哪了?

    来源丨海克财经与共享充电宝相差不多,共享单车已很久没有被国内热点新闻关照到了。除了一再涨价和用户直呼用不起了。近日多家媒体再发报道称,成都、天津、郑州等地多个共享单
  • 品牌洞察丨服务本地,美团直播成效几何?

    来源:17PR7月11日,美团App首页推荐位出现“美团直播”的固定入口。在直播聚合页面,外卖“神枪手”直播间、美团旅行直播间、美团买菜直播间等均已上线,同时
  • Counterpoint :OPPO双旗舰战略全面落地 高端产品销量增长22%

    2023年6月30日,全球行业分析机构Counterpoint Research发布的《中国智能手机高端市场白皮书》显示,中国智能手机品牌正在寻求高质量发展,中国高端智能
  • 2021中国国际消费电子博览会与青岛国际软件融合创新博览会新闻发布会隆重举行

    9月18日,2021中国国际消费电子博览会与青岛国际软件融合创新博览会新闻发布会在青岛国际新闻中心隆重举行。发布会上青岛市政府领导联袂出席,对本次双展会情
Top