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

JS 中沒有函數重載,又是如何實現函數重載的呢?

開發 前端
重載函數指的是兩個或兩個以上的同名函數,實現一個函數名有多種功能。

面試官問你 JS 是如何實現函數重載的?你會怎么回答?

你會不會疑問我在書里看的明確講 JS 是沒有函數重載的,面試官說能實現,那肯定是有辦法的呀,該如何實現呢?

一、什么是函數重載?

重載函數指的是兩個或兩個以上的同名函數,實現一個函數名有多種功能。

函數重載要求編譯器能夠在調用函數時唯一確定,應該調用的是哪個函數?由于同名函數有多個,在確定函數實現時,需要根據函數的參數的個數和類型來區分,即實現函數重載時,要求同名函數的參數個數或類型不一致,否則將無法實現函數重載。

重載的特點:

  • 同名的多個函數。
  • 不同的參數。

二、JS中有函數重載嗎?

我在閱讀《JavaScript 高級程序設計(第三版)》一書,在第五章看到明確的提示 JS 沒有函數重載。

我們在 《JavaScript 高級程序設計(第三版)》 書中能看到,JS 中的同名函數,前面的會被最后面的函數覆蓋掉,根本無法實現多種功能,如:

function add(a,b) {
return a+b
}
function add(a, b, c) {
return a + b + c
}
console.log(add(1,2)); // NaN
console.log(add(1,2,3 ));// 6

如果我們需要使用 JS 實現上述 add 方法,將兩個或三個數值進行求和,該怎么解決呢?

解決1:利用 arguments

function add() {
var reg = arguments;
if (reg.length == 2) {
return reg[0] + reg[1]
} else if(reg.length == 3) {
return reg[0] + reg[1] + reg[2]
}
}
console.log(add(1, 2)) //3
console.log(add(1, 2, 3)) //6

上述方法雖然實現了上述簡單功能,勉強能算得上是一種函數重載的實現方法,但是存在一定的弊端。

它的缺點:

  • 如果功能復雜時,代碼量過大。
  • 不利于維護和復用。

這時候問題來了,利用 JS 如何實現呢?可以通過閉包的形式可以簡單地實現。

三、JS 如何實現重載?

function addMethodToObject (obj, name, fn) {
const temp = obj[name]
obj[name] = function () {
if (fn.length === arguments.length) {
return fn.apply(obj, arguments)
} else if (typeof temp === 'function') {
return temp.apply(obj, arguments)
}
}
}

上述方法用來給一個對象添加自定義方法,能夠接收三個參數:

  1. 需要添加方法的對象
  2. 自定義方法名
  3. 定義方法具體要實現的功能,通過回調實現
addMethodToObject(group, 'find', function () {
return {
peoples: this.peoples,
count: this.peoples.length
}
})
addMethodToObject(group, 'find', function (isMale) {
if (!!isMale) {
const male = this.peoples.filter(item => item.sex === 'male')
return {
peoples: male,
count: male.length
}
} else {
const female = this.peoples.filter(item => item.sex === 'female')
return {
peoples: female,
count: female.length
}
}
})
addMethodToObject(group, 'find', function (elder, age) {
if (!!elder) {
const elder = this.peoples.filter(item => item.age >= age)
return {
peoples: elder,
count: elder.length
}
} else {
const younger = this.peoples.filter(item => item.age < age)
return {
peoples: younger,
count: younger.length
}
}
})
const group = {
total: 10,
male: 6,
female: 4,
peoples: [{
age: 12,
sex: 'male'
}, {
age: 18,
sex: 'female'
}]
}
group.find()
group.find(1)
group.find(0, 15)

總結:JS 沒有函數重載,但是可以實現函數重載。

責任編輯:姜華 來源: 今日頭條
相關推薦

2023-04-14 15:44:20

TypeScrip函數重載

2010-01-20 17:48:07

C++ 函數重載

2010-01-18 16:56:30

C++函數

2009-07-31 16:00:30

C#函數重載

2011-03-14 10:47:30

HashMap

2011-07-20 17:16:50

C++重載函數

2022-01-04 19:21:04

函數TypeScript重載

2010-02-05 15:59:26

C++函數重載

2021-12-10 09:11:36

TypeScript 函數重載 TS 前端

2009-09-01 11:28:32

C#使用函數重載

2022-09-02 17:07:46

C語言main()

2022-04-11 19:55:26

函數類型函數重載

2016-12-26 09:23:18

C++函數覆蓋

2009-05-26 09:31:00

C++重載覆蓋

2024-04-15 12:54:40

2010-02-04 09:26:23

C++模板函數重載

2010-01-11 15:21:18

C++語言

2022-04-13 21:07:30

Vue 3函數重載

2024-03-21 10:48:21

JS重載Java

2022-07-04 08:54:39

Swift處理器項目
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品一区二区三区蜜桃视频 | 午夜日韩精品 | 91国内产香蕉 | 精品日本久久久久久久久久 | 久久国产欧美日韩精品 | 亚洲伊人久久综合 | 久久99蜜桃综合影院免费观看 | 久久久久91 | 久久高清国产视频 | av一区二区三区四区 | 91视频进入 | 成人婷婷 | 在线视频 亚洲 | 黄色播放| 一区二区三区成人 | 国产精品久久久久久久久免费樱桃 | 国产亚洲精品综合一区 | 欧美毛片免费观看 | 色天堂视频| 毛片网站免费观看 | 精品一区二区久久久久久久网站 | 久久精品视频一区二区三区 | 欧美日韩综合精品 | 91网站在线观看视频 | 国产精品国色综合久久 | www.天天操 | 精品国产精品 | 在线观看国产视频 | 91精品国产综合久久久久久首页 | 日韩亚洲一区二区 | 久久久久国产精品 | 成人天堂噜噜噜 | 精品在线一区 | 99re在线 | 国产成人精品视频 | 久久久久久免费毛片精品 | 久久成人激情 | 国产一区二区三区色淫影院 | 日韩毛片 | 午夜爽爽爽男女免费观看 | 欧美一级做a爰片免费视频 国产美女特级嫩嫩嫩bbb片 |