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

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

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

什么是重载

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

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

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

我的做法

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

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

高端做法

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

标签:
  • 热门焦点
  • 小米官宣:2023年上半年出货量中国第一!

    今日早间,小米电视官方微博带来消息,称2023年小米电视上半年出货量达到了中国第一,同时还表示小米电视的巨屏风暴即将开始。“公布一个好消息2023年#小米电视上半年出货量中国
  • 一文看懂为苹果Vision Pro开发应用程序

    译者 | 布加迪审校 | 重楼苹果的Vision Pro是一款混合现实(MR)头戴设备。Vision Pro结合了虚拟现实(VR)和增强现实(AR)的沉浸感。其高分辨率显示屏、先进的传感器和强大的处理能力
  • Golang 中的 io 包详解:组合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是对Reader和Writer接口的组合,
  • 三言两语说透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用
  • 从零到英雄:高并发与性能优化的神奇之旅

    作者 | 波哥审校 | 重楼作为公司的架构师或者程序员,你是否曾经为公司的系统在面对高并发和性能瓶颈时感到手足无措或者焦头烂额呢?笔者在出道那会为此是吃尽了苦头的,不过也得
  • 微软邀请 Microsoft 365 商业用户,测试视频编辑器 Clipchamp

    8 月 1 日消息,微软近日宣布即将面向 Microsoft 365 商业用户,开放 Clipchamp 应用,邀请用户通过该应用来编辑视频。微软于 2021 年收购 Clipchamp,随后开始逐步整合到 Microsof
  • 当家的盒马,加速谋生

    来源 | 价值星球Planet作者 | 归去来自己“当家”的盒马,开始加速谋生了。据盒马官微消息,盒马计划今年开放生鲜供应链,将其生鲜商品送往食堂。目前,盒马在上海已经与
  • 阿里瓴羊One推出背后,零售企业迎数字化新解

    作者:刘旷近年来随着数字经济的高速发展,各式各样的SaaS应用服务更是层出不穷,但本质上SaaS大多局限于单一业务流层面,对用户核心关切的增长问题等则没有提供更好的解法。在Saa
  • Windows 11发布,微软一改往常对老机型开放的态度

    距离 Windows 11 发布已经过去一周,在过去一周里,很多数码爱好者围绕其对 Android 应用的支持、对老机型的升级问题展开了激烈讨论。与以往不同的是,在这次大
Top