js模擬如何實現重載以及默認參數
模擬實現重載以及默認參數
眾所周知,js是函數不支持重載和默認參數的,但是我們可以使用一些其他方法來模擬這個方法的實現。
- 首先看一下重載的定義:函數名相同,函數的參數列表不同(包括參數個數和參數類型),至於返回類型可同可不同。
- 以及默認參數的定義:默認參數指的是當函數調用中省略瞭實參時自動使用的一個值。
那麼如何實現這兩個功能呢,一個很簡單的方法就是使用arguments來進行模擬。
下面先說實現重載的方法
function overLoad(){//用這樣的方法模擬重載 if(arguments[0]){//如果存在第一個參數 if(arguments[1]){//如果第一個參數第二個參數都存在 //to do... alert(arguments[0]+arguments[1]); } else{//如果隻有第一個參數 alert(arguments[0]); //to do... } } else{//如果無參 alert("null"); //to do... } }
接下來是實現默認參數的方法
function defaultArg(){//用這樣的方法模擬默認參數 var a = arguments[0]?arguments[0]:"hello";//第一個參數的默認值為hello var b = arguments[1]?arguments[1]:"world";//第二個參數的默認值為world //... alert(a+b); }
下面進行一下測試
//重載測試 overLoad();//null overLoad("hello ");//hello overLoad("hello ","world");//hello world //默認參數測試 defaultArg();//hello world defaultArg("你好 ");//你好 world defaultArg("你好 ","世界");//你好 世界
js的函數支持重載嗎
JavaScript的函數支持重載嗎?對於這個問題,主要有兩個點,第一,JavaScript的函數;第二,重載。
首先,說一下重載。所謂重載,簡單說,就是函數或者方法有相同的名稱,但是參數列表不相同的情形,這樣的同名不同參數的函數或者方法之間,互相稱之為重載函數或者方法。所以說,重載主要需要兩點:第一,同樣的函數名。第二,不同的函數參數。
明確瞭重載的定義之後,我們再回到JavaScript這裡。追本溯源,現在一說到JavaScript,我們就可以聯想到ECMAScript,即JavaScript的標準。那麼,這個標準裡面對函數做出瞭那些規范呢?
首先,ECMAScript是沒有函數簽名的概念的,因為其參數是由包含零或多個值的數組來表示的。而沒有函數簽名,真正的重載是不可能做到的。
其次,如果在ECMAScript中定義瞭兩個名字相同的函數,則該名字隻屬於後定義的函數,如下:
function add(num){ return num+1; } function add(num){ return num+2; } var result = add(4); //結果為6
在上面的例子中,add()函數被定義瞭兩次,然而,當我們調用他的時候,卻直接調用瞭第二個函數,這說明在JavaScript中,後定義的函數會覆蓋先定義的函數。
說到這裡,是不是就可以判定JavaScript不支持函數重載瞭呢?
讓我來介紹一下JavaScript裡面的一個arguments對象。首先,ECMAScript函數的參數與其他語言的函數參數有一點不同。ECMAScript函數不介意傳進來的參數個數和類型。也就是說,在你定義瞭函數隻接受兩個參數之後,你仍然可以在調用的時候傳遞零或多個參數。這並不會報錯。原因就在於arguments對象。ECMAScript中,函數的參數始終是存放在一個數組中,而通過arguments對象,就可以訪問到這個數組。所以,隻需要使用length屬性就可以確定調用函數時傳遞瞭多少個參數。
說到這裡,我們可以來嘗試這樣寫:
function add(num1, num2){ if(arguments.length == 1){ alert("你輸入的隻有一個數字:"+arguments[0]+" 請重新輸入"); }else if(arguments.length == 2){ alert("你輸入數字的和為:" + arguments[0]+arguments[1]); } }
通過這個例子,我們可以看出,通過檢查傳入函數中參數的數量,JavaScript函數可以做出不同的反應,這可以間接達到重載的目的。
所以,JavaScript是可以模仿函數的重載的。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持LevelAH。
推薦閱讀:
- JavaScript的function函數詳細介紹
- JS深入淺出Function與構造函數
- 初識JavaScript的基礎
- JavaScript三大變量聲明詳析
- JavaScript基礎語法與數據類型介紹