JS階段編--関数の実際のパラメータを行列に変換する方法[].slite.cal(argments)


実際のパラメータは関数でargmentsオブジェクトを使用して得られます.argmentsオブジェクトは配列と似ていますが、まだ本当の意味での配列ではありません.
配列のslice法でargmentsオブジェクトを本物の配列に変換できます.
方法1:Array.prototype属性によりsliceメソッドを呼び出します.
var args = Array.prototype.slice.call(arguments);
Aray自体はsliceの方法がないので、Aray.prototypeの中で、私達がsliceの方法を呼び出した時、Aray自身がsliceの方法を見つけられなかったら、そのプロトタイプのチェーンを通して上を探します.
方法2:[]のsliceメソッドを呼び出すことにより
var args = [].slice.call(arguments, 0);
方法の3:argmentsを遍歴することによって、配列を返します.
function toArray(){
    var args = []; 
    for (var i = 1; i < arguments.length; i++) { 
        args.push(arguments[i]); 
    } 
    return args;
}
注:一般的な関数のargments.lengthはすべて10以内で、方法の2は優位があります.方法二のコード量も第一のものより少なく、少なくともバイトを少し減らすことができる.
例:
function revse(){
    try{
        return Array.prototype.slice.call(arguments);
    }
    catch(e){
        var newarr=[];
        for(var i=arguments.length-1;i>=0;i--){ 
          //newarr.push(arguments[i]);
          newarr[i] = arguments[i]; //   push ?
        }
        return newarr;
    }
}      
var s = revse('a','b','c');
console.log(s); //["a", "b", "c"]
argments問題に関するテーマは、ある場面で関数のargmentsパラメータを一つの配列として呼び出す必要がありますが、argmentsは特異なオブジェクトですので、argmentsを一つの配列に変換してみます.例えば、次の例:
function argToArr(){
    return [].slice.call(arguments, 0);
}
console.log(argToArr(1,2,3));    //[1,2,3]

function argToArr(){
    return Array.slice.call(arguments, 0);
}
console.log(argToArr(1,2,3));    //Uncaught TypeError: Cannot read property 'call' of undefined
これはなぜですか?第二段コードのエラーは、Arayが構造関数であり、対象ではないので、コンソールを開いてtypeof Arrayを入力し、結果はfunctionです.slice()方法は、そのプロトタイプオブジェクトにおいて、[]Arra yのプロトタイプオブジェクトであり、コンソールにArray.prototypeを入力した結果、[]であったので、第1のセグメントコードがスムーズに実行される.
第二段コードは次のように修正すればいいです.
function argToArr(){
    return Array.prototype.slice.call(arguments, 0); //     
}
console.log(argToArr(1,2,3));