javascript関数の再負荷解決策を共有する。


JSの関数の定義は形式パラメータの名前を指定できます。少なくともjsはパラメータの個数の異なる方法で再負荷することができると思います。しかし、残念なことに、これは一つの仮象にすぎません。jsのすべてのパラメータはargmentsで過去に伝達されます。このパラメータは数セットに類似しています。関数呼び出し時、すべてのパラメータはこのデータ構造に保存されています。関数を定義するときに指定された形式パラメータは、実はこのデータ構造の中のデータのためのすばやいアクセス方法を定義します。つまり、jsのすべての関数は無限のパラメータをサポートしています。データの種類は弱タイプです。JSの関数は名前以外は本当に区別できません。
方法はいつもあります。JavaScriptの中の特殊な対象であるargmentsを利用して関数をシミュレートして再負荷します。これを用いて、着信パラメータの数またはタイプを判断して、重負荷を区別する。
1.パラメータの個数に応じて積載する
jsは、着信パラメータの数をargments.lengthという属性で判断することができると判断する。

<script type="text/javascript">
function add() {
    if (arguments.length == 1) {
        alert(arguments[0] + 10);
    }
    else if (arguments.length == 2) {
        alert(arguments[0] + arguments[1]);
    }
}
//
add(10);
add(10, 20);
</script>
2.パラメータの種類に応じて再ロードする
変数タイプを判断する3つの方法:1.typeof文で変数タイプを判断し、typeof文はタイプに対応する文字列を返します。2.instance of文で変数の種類を判断し、instance of文はtrue/falseに戻ります。3.constructor属性で変数のタイプを判断し、この属性はこの変数を構成するためのコンストラクタ参照に戻ります。対照表:typeofでは正確に特定のタイプを判断できないことが分かりますので、constructorで判断します。
typeof
ストリングス
number
object
機能
bollan
object
object
トラック
String
Number
Object
Function
ボロア
Aray
User Define

<script type="text/javascript">
function add()
{
    if (arguments.length == 0) return 0;
    var sum=0;
    for(var i=0; i<arguments.length; i++){
        if(arguments[i].constructor == Number){
        // :if(arguments[i] instanceof Number)
        // :if(typeof(arguments[i])=="number")
        sum += arguments[i];
      }
    }
    return sum;
}
//
alert(add(10));
alert(add(10,20));
</script>