js模擬如何實(shí)現(xiàn)重載以及默認(rèn)參數(shù)
模擬實(shí)現(xiàn)重載以及默認(rèn)參數(shù)
眾所周知,js是函數(shù)不支持重載和默認(rèn)參數(shù)的,但是我們可以使用一些其他方法來(lái)模擬這個(gè)方法的實(shí)現(xiàn)。
- 首先看一下重載的定義:函數(shù)名相同,函數(shù)的參數(shù)列表不同(包括參數(shù)個(gè)數(shù)和參數(shù)類型),至于返回類型可同可不同。
- 以及默認(rèn)參數(shù)的定義:默認(rèn)參數(shù)指的是當(dāng)函數(shù)調(diào)用中省略了實(shí)參時(shí)自動(dòng)使用的一個(gè)值。
那么如何實(shí)現(xiàn)這兩個(gè)功能呢,一個(gè)很簡(jiǎn)單的方法就是使用arguments來(lái)進(jìn)行模擬。
下面先說(shuō)實(shí)現(xiàn)重載的方法
function overLoad(){//用這樣的方法模擬重載
if(arguments[0]){//如果存在第一個(gè)參數(shù)
if(arguments[1]){//如果第一個(gè)參數(shù)第二個(gè)參數(shù)都存在
//to do...
alert(arguments[0]+arguments[1]);
}
else{//如果只有第一個(gè)參數(shù)
alert(arguments[0]);
//to do...
}
}
else{//如果無(wú)參
alert("null");
//to do...
}
}接下來(lái)是實(shí)現(xiàn)默認(rèn)參數(shù)的方法
function defaultArg(){//用這樣的方法模擬默認(rèn)參數(shù)
?? ?var a = arguments[0]?arguments[0]:"hello";//第一個(gè)參數(shù)的默認(rèn)值為hello
?? ?var b = arguments[1]?arguments[1]:"world";//第二個(gè)參數(shù)的默認(rèn)值為world
?? ?//...
?? ?alert(a+b);
}下面進(jìn)行一下測(cè)試
//重載測(cè)試
overLoad();//null
overLoad("hello ");//hello?
overLoad("hello ","world");//hello world
//默認(rèn)參數(shù)測(cè)試
defaultArg();//hello world
defaultArg("你好 ");//你好 world
defaultArg("你好 ","世界");//你好 世界js的函數(shù)支持重載嗎
JavaScript的函數(shù)支持重載嗎?對(duì)于這個(gè)問(wèn)題,主要有兩個(gè)點(diǎn),第一,JavaScript的函數(shù);第二,重載。
首先,說(shuō)一下重載。所謂重載,簡(jiǎn)單說(shuō),就是函數(shù)或者方法有相同的名稱,但是參數(shù)列表不相同的情形,這樣的同名不同參數(shù)的函數(shù)或者方法之間,互相稱之為重載函數(shù)或者方法。所以說(shuō),重載主要需要兩點(diǎn):第一,同樣的函數(shù)名。第二,不同的函數(shù)參數(shù)。
明確了重載的定義之后,我們?cè)倩氐絁avaScript這里。追本溯源,現(xiàn)在一說(shuō)到JavaScript,我們就可以聯(lián)想到ECMAScript,即JavaScript的標(biāo)準(zhǔn)。那么,這個(gè)標(biāo)準(zhǔn)里面對(duì)函數(shù)做出了那些規(guī)范呢?
首先,ECMAScript是沒(méi)有函數(shù)簽名的概念的,因?yàn)槠鋮?shù)是由包含零或多個(gè)值的數(shù)組來(lái)表示的。而沒(méi)有函數(shù)簽名,真正的重載是不可能做到的。
其次,如果在ECMAScript中定義了兩個(gè)名字相同的函數(shù),則該名字只屬于后定義的函數(shù),如下:
function add(num){
? ? return num+1;
}
function add(num){
? ? return num+2;
}
var result = add(4); ?//結(jié)果為6在上面的例子中,add()函數(shù)被定義了兩次,然而,當(dāng)我們調(diào)用他的時(shí)候,卻直接調(diào)用了第二個(gè)函數(shù),這說(shuō)明在JavaScript中,后定義的函數(shù)會(huì)覆蓋先定義的函數(shù)。
說(shuō)到這里,是不是就可以判定JavaScript不支持函數(shù)重載了呢?
讓我來(lái)介紹一下JavaScript里面的一個(gè)arguments對(duì)象。首先,ECMAScript函數(shù)的參數(shù)與其他語(yǔ)言的函數(shù)參數(shù)有一點(diǎn)不同。ECMAScript函數(shù)不介意傳進(jìn)來(lái)的參數(shù)個(gè)數(shù)和類型。也就是說(shuō),在你定義了函數(shù)只接受兩個(gè)參數(shù)之后,你仍然可以在調(diào)用的時(shí)候傳遞零或多個(gè)參數(shù)。這并不會(huì)報(bào)錯(cuò)。原因就在于arguments對(duì)象。ECMAScript中,函數(shù)的參數(shù)始終是存放在一個(gè)數(shù)組中,而通過(guò)arguments對(duì)象,就可以訪問(wèn)到這個(gè)數(shù)組。所以,只需要使用length屬性就可以確定調(diào)用函數(shù)時(shí)傳遞了多少個(gè)參數(shù)。
說(shuō)到這里,我們可以來(lái)嘗試這樣寫:
function add(num1, num2){
? ? if(arguments.length == 1){
? ? ? ? alert("你輸入的只有一個(gè)數(shù)字:"+arguments[0]+" 請(qǐng)重新輸入");
? ? }else if(arguments.length == 2){
? ? ? ? alert("你輸入數(shù)字的和為:" + arguments[0]+arguments[1]);
}
}通過(guò)這個(gè)例子,我們可以看出,通過(guò)檢查傳入函數(shù)中參數(shù)的數(shù)量,JavaScript函數(shù)可以做出不同的反應(yīng),這可以間接達(dá)到重載的目的。
所以,JavaScript是可以模仿函數(shù)的重載的。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript子類用Object.getPrototypeOf去調(diào)用父類方法解析
這篇文章主要介紹了JavaScript子類用Object.getPrototypeOf去調(diào)用父類方法。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-12-12
js中關(guān)于new Object時(shí)傳參的一些細(xì)節(jié)分析
這里討論給Object傳參時(shí),其內(nèi)部的處理。參考:ECMA262 V5 15.2.2.12011-03-03
uniapp中scroll-view基礎(chǔ)用法示例代碼
我們?cè)陧?xiàng)目中往往都能遇到實(shí)現(xiàn)左右滑動(dòng)跟上下滑動(dòng)的需求,下面這篇文章主要給大家介紹了關(guān)于uniapp中scroll-view基礎(chǔ)用法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11
使用js簡(jiǎn)單實(shí)現(xiàn)了tree樹(shù)菜單
使用js簡(jiǎn)單實(shí)現(xiàn)了樹(shù)菜單!具體實(shí)現(xiàn)實(shí)例代碼如下,相信自己你一定可以實(shí)現(xiàn)的更好2013-11-11
Javascript中string轉(zhuǎn)date示例代碼
string轉(zhuǎn)date的方法有很多,在接下來(lái)為大家介紹下Javascript中是如何做到的,感性取的朋友不要錯(cuò)過(guò)2013-11-11

