JavaScript Diary

多重定義は不可能 [ 2001/07/08 ]
なかには Java をやっていた方で JavaScript をはじめた方もいるかも知れませんが、いわずもがな JavaScript は Java とは全然違うものです。Java には多重定義というものがありますが、JavaScript ではそれは実現出来ません。例えば、JavaScript で以下のように書いても最後に定義されたものに置き換わってしまいます。
function add(){ return 0 ; }

// number x
function add( x ){ return ++x ; }

// number x , number y
function add( x , y ){ return x+y ; }

// number x , number y , number z
function add( x , y , z ){ return x+y+z ; }

// number[] array
function add( array ){
    var s = 0 ;
    for(var i=0;i<array.length;i++) s += array[i];
    return s ;
}
JavaScript では関数の引数の型を指定する方法がないので、ある意味それ以前の問題ですが、JavaScript は Java でいう多重定義と同じような処理が別の方法でもっと汎用的に実現できます。例えば、上の例で示す4つの add 関数を一つの関数定義でまとめて書くことができます。
// add 関数、引数名は書いても書かなくても良い。
function add(){
    // 関数の引数を保持するオブジェクト arguments
    // 例えば引数が1個のときその値は arguments[0] で参照できる。
    var a = arguments ;
    // 引数の個数により処理を分岐( arguments.length で引数の個数を表す )
    switch( a.length ){
        // 引数の個数が0、又はどれにも当てはまらないとき
        case 0 : default : return 0 ;
        // 引数の個数が1のとき
        // その型が Array(配列) のときその中身を全て足したものを返す
        case 1 : {
            if( a[0].constructor === Array ){
                var s = 0 ;
                for(var i=0;i<a[0].length;i++) s += a[0][i];
                return s ;
            }else{
                return ++a[0];
            }
        }
        // 引数の個数が2のとき
        case 2 : return a[0]+a[1];
        // 引数の個数が3のとき
        case 3 : return a[0]+a[1]+a[2];
    }
}