JS階段編--関数の実際のパラメータを行列に変換する方法[].slite.cal(argments)
2109 ワード
実際のパラメータは関数でargmentsオブジェクトを使用して得られます.argmentsオブジェクトは配列と似ていますが、まだ本当の意味での配列ではありません.
配列のslice法でargmentsオブジェクトを本物の配列に変換できます.
方法1:
方法2:
例:
第二段コードは次のように修正すればいいです.
配列の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));