JavaScript argumentsオブジェクト


JavaScriptの関数は、関数内のオブジェクトパラメータにパラメータを格納します.
アレイの特徴があるが、アレイの方法がないため、類似アレイとも呼ばれる.

1. arguments


1)定義


Argumentsは、関数のパラメータを配列形式で含む関数の領域変数です.
パラメータは類似配列とも呼ばれます.これは,配列にlength,インデックスアクセスなどの特性があるが,map,forEachなどの配列の関数は使用できないためである.

2)例

function sumAll() {
	let result = 0

	// 파라미터를 지정해주지 않아도, arguments 객체에 받을 수 있습니다.
	for(const item of arguments) {
		result += item
	}

	console.log('arguments', arguments)
	
	return result
}

console.log('sumAll', sumAll(1, 2, 3, 4, 5)) // 15
sumAll関数にはパラメータは指定されていませんが、パラメータを使用してパリメートルの和を計算できます.

3)類似配列


MDNによれば、類似配列の意味は以下の通りである.
注意:「Array Formate」は、パラメータがlengthプロパティとともにゼロからインデックスを持つ他のプロパティを表しますが、ArrayのforEachやmapなどの組み込みメソッドはありません.
すなわち,配列と同様に配列はlength,indexなどの属性を持つが,map,forEachなどの配列メソッドは使用できない.
そしてアリーisArrayで検査したところfalseでした.
function temp() {
    console.log('isArray', Array.isArray(arguments))
}

temp(1, 2, 3) // isArray false

4)利用率


不確定な数のパラメータを受け取ると、パラメータも役に立つように見えます.

しかし、パラメータが指定されていないため、関数が見えにくく、その目的のために作成されたと感じます。 多くの点で残念であれば、Restパラメータを調べてみましょう。

2.Restパラメータ


1)定義


MDNによれば、Restパラメータの意味は以下の通りである.
Restパラメータ構文は、不確定な数のパリメートルを配列形式で表示することを可能にする.

2)例

// 스프레드 연산자를 사용해서 파라미터를 받습니다.
function sumAll(... args) {
    console.log('args', args) // args [1, 2, 3, 4, 5]
    
	console.log('isArray', Array.isArray(args)) // isArray true

	return args.reduce((previous, current) => {
		return previous + current
	})
}

console.log('sumAll', sumAll(1, 2, 3, 4, 5)) // 15
sumall関数は、パラメータ値の和を返す関数です.
RESTパラメータargsは配列であるため,配列法reduce(重複文ではなく)を用いて求和コードを直感的に記述することができる.

3)パラメータとの比較


パラメータと比較してRestパラメータの利点は次のとおりです.
  • 関数を見ると、パラメータが不確定な関数であることがわかります.
  • の配列方法により、コードを直感的に記述できます.
  • ... それでは本当に論争する必要はありませんか..。

    3.運用論点

    function max(a, b) {
    	
    	console.log('함수에서 지정한 파라미터 개수', max.length)
    	console.log('실제로 받은 파라미터 개수', arguments.length)
    
    	if(max.length !== arguments.length) {
    		console.warn('max 함수는 2개의 파라미터를 받아 2개중 최대값을 찾는 함수입니다. 2개 이상의 파라미터를 받아 앞의 2개의 파라미터로만 계산되었습니다.')
    	}
    
    	return a + b
    }
    
    console.log(max(1, 2, 3)) // 3

    1) function.length


    JavaScript関数のlengthプロパティには、定義されたパラメータ数が格納されます.
    function max(a, b) {
    	return a > b ? a : b
    }
    
    console.log('max.length', max.length) // 2 - a, b 2개의 파라미터가 있습니다.

    2) arguments.length


    次の2つが異なる場合は、受信した応答が予想される関数と異なることを警告できます.
    function.length-関数に指定したパラメータ数
    argumens.length-実際に受信したパラメータ数

    3)Fire Fox Gecko例


    以下はFire Fox Geckoエンジンコードの一部であり、Arrayのmapメソッドのソースコードである.
    /* ES5 15.4.4.18. */
    function ArrayForEach(callbackfn/*, thisArg*/) {
        /* Step 1. */
        var O = ToObject(this);
    
        /* Steps 2-3. */
        var len = ToLength(O.length);
    
        /* Step 4. */
        if (arguments.length === 0)
            ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.prototype.forEach");
        if (!IsCallable(callbackfn))
            ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, callbackfn));
    
        /* Step 5. */
        var T = arguments.length > 1 ? arguments[1] : void 0;
    
        /* Steps 6-7. */
        /* Steps a (implicit), and d. */
        for (var k = 0; k < len; k++) {
            /* Step b */
            if (k in O) {
                /* Step c. */
                callContentFunction(callbackfn, T, O[k], k, O);
            }
        }
    
        /* Step 8. */
        return void 0;
    }
    Arrayのmapメソッドは、アレイ内の各要素のパラメータコールバック関数の結果を返します.
    mapメソッドでは,パラメータとして関数を受信し,他の状況を異常処理する必要がある.
    if (arguments.length === 0)
    	ThrowTypeError(JSMSG_MISSING_FUN_ARG, 0, "Array.prototype.forEach");
    var T = arguments.length > 1 ? arguments[1] : void 0;

    4. function.call


    1)配列パラメータ


    MDNの資料に従って、以下の方法で類似配列のパラメータを配列します.
    function f() {
    	var normalArray = Array.prototype.slice.call(arguments)
    }
    ここでもう一度観察してみると...

    コールとは?


    実際、JavaScriptで関数を呼び出す方法は1つだけではありません.
    ほとんどは함수명()を使用しますが、関数function.call()を呼び出すこともできます.
    callの違いは、callの最初のパラメータ値が呼び出し関数の内部でthisとして使用されることである.
    var normalArray = Array.prototype.slice.call(arguments)
    上記の例では、Arrayオブジェクト内のsliceメソッドを使用してパラメータを最初のパラメータ値として渡し、slice関数のthisはargumentsになって動作します.

    3)確認


    Array.isArrayチェックを使用すると、出力はtrueになります.
    map,reduceなどの配列法を用いることは可能である.
    function sumAll() {
        // arguments 객체
        console.log('arguments', arguments)
    
        // Array 객체의 this를 arguments로 지정 후, slice 메서드 사용
        const arr = Array.prototype.slice.call(arguments) 
        
        // 배열 arr 출력
        console.log('arr', arr)
        
        // 배열의 메서드 map사용, [2, 4, 6]
        console.log(arr.map((chip) => {return chip * 2}))
        
        // 배열 여부 확인, true
        console.log('isArray', Array.isArray(arr))
    
       // Array 객체의 redcue 메서드를 사용해서 배열의 전체합 리턴
       return Array.prototype.reduce.call(arguments, (prev, cur) => {
        	return prev + cur
       })
    }
    
    console.log(sumAll(1, 2, 3)) // 6

    4) call, apply, bind


    雑談の中でcallと一緒にいるものはcall、apply、bindです.次の文章で理解してみましょう.