日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2024-03-22 08:56:00 209觀看
導讀什么是重載我第一次看到重載這個詞還是在以前學習Java的時候,我一直覺得JavaScript是沒有重載的,直到TypeScript的出現,所以我一直覺得JavaScript沒有重載,TypeScript才有,但是現在看來我是錯的。我理解的重載是:同樣的函數

什么是重載

我第一次看到重載這個詞還是在以前學習Java的時候,我一直覺得JavaScript是沒有重載的,直到TypeScript的出現,所以我一直覺得JavaScript沒有重載,TypeScript才有,但是現在看來我是錯的。8LN28資訊網——每日最新資訊28at.com

我理解的重載是:同樣的函數,不同樣的參數個數,執行不同的代碼,比如:8LN28資訊網——每日最新資訊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的定義,把前面兩個都給覆蓋了,所以沒有實現重載的效果。8LN28資訊網——每日最新資訊28at.com

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

我的做法

其實,想要實現理想的重載效果,我還是有辦法的,我可以只寫一個fn函數,并在這個函數中判斷arguments類數組的長度,執行不同的代碼,就可以完成重載的效果。8LN28資訊網——每日最新資訊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歲,喜歡運動是打籃球

但是那位同學說,網易的面試官好像覺得這么實現可以是可以,但是還有沒有更好的實現方法,我就懵逼了。8LN28資訊網——每日最新資訊28at.com

高端做法

經過了我的一通網上查找資料,發現了一種比較高端的做法,可以利用閉包來實現重載的效果。這個方法在JQuery之父John Resig寫的《secrets of the JavaScript ninja》中,這種方法充分的利用了閉包的特性!8LN28資訊網——每日最新資訊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.www897cc.com/showinfo-26-78507-0.html網易面試官:請你實現一下JS重載?可不是TS重載哦!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 癱瘓8年小哥植入馬斯克腦機接口,狂打8小時「文明6」!Neuralink首個人類植入者直播來了

下一篇: Excel數據處理利器:C#中三款熱門開源類庫推薦及實例代碼解析

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 克拉玛依市| 安吉县| 赣州市| 湘乡市| 潼关县| 报价| 阿坝| 武安市| 中西区| 玛沁县| 佛冈县| 陵水| 沾化县| 油尖旺区| 开化县| 多伦县| 汝南县| 高陵县| 修水县| 沙坪坝区| 育儿| 阳泉市| 奉贤区| 郑州市| 临沧市| 陵川县| 五台县| 洪洞县| 新沂市| 三江| 留坝县| 凤山市| 阳朔县| 嘉善县| 开原市| 咸阳市| 威海市| 长子县| 峡江县| 顺昌县| 平安县|