JS関数の中のアーグメンント

1327 ワード

アーグメンントの顔
javascriptにはすべての関数の内部に隠された変数を含んでいます.アーグメンツといいます.この関数に伝わるすべてのパラメータが保存されています.例を開けてみます.argmentsの出力形式を見てみます.
(function fn(){
    console.log(arguments)
})(1,2,3,4)
結果は配列のような形でコンソールに印刷されているようです.多くの人は私を含めてこのような出力を見ると、argmentsは配列と考えられます.配列である以上は配列のいくつかの方法を使ってもいいですよね.次の例を見てください.
(function fn(){
    arguments.push(5)
    console.log(arguments)
})(1,2,3,4)
結果は間違えました.(プロジェクトの中で私はこのピットを踏んだのです)行列なのにどうしてpushの方法が使えないのかという疑問があります.他の写真のpop、sliceもだめですか?はい、全部だめです.argmentsも下記の形式で対応位置のパラメータを獲得できますが、本質的には本当の配列とは言えません.
私たちはinstance ofプリントでArayの子供かどうか見てみます.
(function fn(){
    console.log(arguments instanceof Array)
})()
案の定、配列ではないです.それは対象です.forサイクルで中のパラメータを遍歴することもできますが、それを本物の配列に変えるのがより良い選択です.
行列に変換
変換の方法はたくさんあります.物体を偽ってAray.prototypeに渡す方法や、空の配列を遍歴したり、他の関数に渡す方法などがあります.全部できます.いくつかの転化の方法を簡単に紹介します.パンシュを遍歴して空の配列に行く方法は詳しく説明しません.
1つ
(function fn(){
    var arr = Array.prototype.slice.call(arguments)
    arr.push(5)
    console.log(arr)
})(1,2,3,4)
このような転化方式は遅く、性能が悪い場合はこのような書き方を勧めないです.
二番目
function fn() {
    fnArr.apply(null, arguments);
}
function fnArr(a,b,c,d) {
    ···
}
個人的にはこのようなやり方を勧めます.
とにかく方法が多いです.みんな自分の習慣を使えばいいです.初めて文章を書きました.あまり多くないですが、上手になりたいです.プロジェクトの過程で、アーグメンツの穴を間違えないようにしてください.