成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

網易面試官:請你實現一下JS重載?可不是TS重載哦!

開發 前端
我第一次看到重載?這個詞還是在以前學習Java?的時候,我一直覺得JavaScript?是沒有重載的,直到TypeScript?的出現,所以我一直覺得JavaScript?沒有重載,TypeScript才有,但是現在看來我是錯的。

什么是重載

我第一次看到重載這個詞還是在以前學習Java的時候,我一直覺得JavaScript是沒有重載的,直到TypeScript的出現,所以我一直覺得JavaScript沒有重載,TypeScript才有,但是現在看來我是錯的。

我理解的重載是:同樣的函數,不同樣的參數個數,執行不同的代碼,比如:

/*
* 重載
*/
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的定義,把前面兩個都給覆蓋了,所以沒有實現重載的效果。

我是林三心,今年undefined歲,喜歡運動是undefined
我是林三心,今年18歲,喜歡運動是undefined
我是林三心,今年18歲,喜歡運動是打籃球

我的做法

其實,想要實現理想的重載效果,我還是有辦法的,我可以只寫一個fn函數,并在這個函數中判斷arguments類數組的長度,執行不同的代碼,就可以完成重載的效果。

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歲,喜歡運動是打籃球

但是那位同學說,網易的面試官好像覺得這么實現可以是可以,但是還有沒有更好的實現方法,我就懵逼了。

高端做法

經過了我的一通網上查找資料,發現了一種比較高端的做法,可以利用閉包來實現重載的效果。這個方法在JQuery之父John Resig寫的《secrets of the JavaScript ninja》中,這種方法充分的利用了閉包的特性!

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函數重載
責任編輯:武曉燕 來源: 前端之神
相關推薦

2023-09-12 14:56:13

MyBatis緩存機制

2024-02-27 15:23:48

RedLock算法Redis

2024-01-29 10:08:11

零拷貝Zero-copyCPU 拷貝

2025-03-10 07:05:07

2021-07-28 10:08:19

類加載代碼塊面試

2011-03-14 10:47:30

HashMap

2021-08-28 09:06:11

Dubbo架構服務

2021-11-08 15:59:01

MyBatis關聯開發

2022-06-07 12:03:33

Java內存模型

2023-02-08 08:32:41

輪詢鎖

2023-02-18 13:34:14

Nacos健康檢查機制

2022-06-06 15:33:20

線程Java釋放鎖

2024-02-21 16:42:00

2020-07-30 07:58:36

加密算法

2021-06-02 11:25:18

線程池Java代碼

2023-03-08 07:46:53

面試官優化結構體

2023-12-29 13:45:00

2023-11-29 08:00:53

JavaTreeMap底層

2022-02-28 08:17:24

重載函數JS前端

2024-07-15 09:08:51

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天拍天天操 | 婷婷综合激情 | 91高清在线视频 | 免费看啪啪网站 | 免费观看的av毛片的网站 | 亚洲视频二区 | 国产在线一区二区三区 | 亚洲麻豆 | 午夜伦理影院 | 成人小视频在线免费观看 | 欧美一区二区三区四区在线 | 白浆在线 | 中文字幕97 | 成年人在线观看 | 国产美女一区二区三区 | 欧美在线一区二区三区 | 亚洲成年在线 | 午夜影院网站 | 久久久不卡网国产精品一区 | 亚洲一区二区三区 | 国产精品一区二区三区在线 | 毛片一级片 | h免费观看 | 在线小视频 | 成人午夜网 | 高清成人免费视频 | 97精品国产手机 | 国产精品久久久久久久久久三级 | 天天爱爱网 | 人人九九精 | 最新国产视频 | 在线观看视频一区 | 久久精品免费一区二区 | 国产精品久久精品 | 国产精品久久久久久久久久久免费看 | 成人国产精品久久 | 4h影视 | 三级国产三级在线 | 久久久久久亚洲精品 | 国产日韩在线观看一区 | 亚洲a网|