不明な数の引数をjavascript関数に渡します


84

次のような不明な数の引数を渡す方法はありますか?

var print_names = function(names) {
    foreach(name in names) console.log(name); // something like this
}

print_names('foo', 'bar', 'baz');

また、渡された引数の数を取得するにはどうすればよいですか?



これまでのところ、パブリックオーバーライドの答えは、未知の数の引数を(関数呼び出しに)渡す方法を説明している唯一のものです(を使用して.apply)。他のもの、(関数内から)未知の数の引数を読み取る方法を示しています(を使用してarguments)。
ベンJ

回答:


146

ES3(またはES5またはoldschool Javascript)

arguments配列と同様に動作するマジックオブジェクトを介して、任意のjavascript関数に渡された引数にアクセスできます。arguments関数の使用は次のようになります

var print_names = function() {
     for (var i=0; i<arguments.length; i++) console.log(arguments[i]);
}

これは配列でargumentsないことに注意することが重要です。MDCにはいくつかの優れたドキュメントがあります:https//developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#Using_the_arguments_object

あなたが変えたい場合はarguments、あなたがのようなものを行うことができるように配列に.slice().push()など、このような使用の何かを:

var args = Array.prototype.slice.call(arguments);

ES6 / Typescript

より良い方法があります!新しいレストパラメータ機能には、次のような特徴があります。

var print_names = function(...names) {
    for (let i=0; i<names.length; i++) console.log(names[i]);
}

3
そのような詳細であると同時に短い+簡単な答えをありがとう:)
Mese 2016年

1
ES6への参照spread syntaxはここではかなり間違っています。それはrest parameterあなたが与えた例です。良い答えは、それは次のように参照されていることを混乱spread
Drenai

ご回答有難うございます!私はこれがで何が起こっているのかを説明する役に立つ記事であることが判明Array.prototype.slice.call(arguments)medium.com/@andrewsburke/...
AnnieP

22

ES6 / ES2015

活用し、残りのパラメータの構文

function printNames(...names) {
  console.log(`number of arguments: ${names.length}`);
  for (var name of names) {
    console.log(name);
  }
}

printNames('foo', 'bar', 'baz');

RESTパラメータと引数オブジェクトの間には3つの主な違いがあります。

  • 残りのパラメーターは、個別の名前が付けられていないパラメーターのみですが、argumentsオブジェクトには、関数に渡されるすべての引数が含まれます。
  • 引数オブジェクトは実際の配列ではありませんが、残りのパラメーターは配列インスタンスです。つまり、sort、map、forEach、popなどのメソッドを直接適用できます。
  • 引数オブジェクトには、それ自体に固有の追加機能があります(calleeプロパティなど)。

これは、通常、一般的なPHP構文を使用するWeb開発に最適です。
ダダン2016



6

JavaScriptのすべての関数に渡される隠しオブジェクトがありますarguments

arguments.length関数に渡される引数の量を取得するために使用するだけです。

引数を反復処理するには、ループを使用します。

for(var i = arguments.length; i--) {
   var arg = arguments[i];
}

argumentsこれは実際の配列ではないことに注意してください。したがって、配列として必要な場合は、次のように変換します。

var args = Array.prototype.slice.call(arguments);

3
それは「本物」の配列ではないことだけノートは、それが「アレイのような」オブジェクト(いくつかの特別な特性を持つ)ですが、それの「アレイ方式」を使用して、あなたはそれ、例えば変換する必要がありますvar args = Array.prototype.slice.call(arguments);var args = Array.apply(null, arguments);などを、多くの方法があります...
クリスチャンC.サルバド2010年

4

arguments.length。forループを使用できます。

(function () {
    for (var a = [], i = arguments.length; i--;) {
        a.push(arguments[i]);
    };
    return a;
})(1, 2, 3, 4, 5, 6, 7, 8)

@meder、私はそのような無名関数を使うのが大好きです。いい例です!また、そこにいくつかのセミコロンがありませんか?
Jacob Relkin 2010年

そのまま正常に動作しているようです。
meder omuraliev 2010年

@ meder、JavaScriptでのセミコロンの挿入#ftf
Jacob Relkin 2010年

@meder、確かに、forブロックの後のセミコロンだけは実際には必要ありませんが、最後の行の最後にセミコロンを追加します。
クリスチャンC.サルバド2010年

1
@weng、それはFunctionExpressionvsについてですFunctionDeclarationこの記事をチェックしてください
クリスチャンC.サルバド2010年

2

ES6の方がはるかに優れています

function Example() {
    return {
        arguments: (...args) =>{
            args.map(a => console.log());
        }
    }
}

var exmpl = new Example();
exmpl.arguments(1, 2, 3, 'a', 'b', 'c');

これがお役に立てば幸いです


0

ES6のRESTパラメーター

const example = (...args) => {
  for (arg in args) {
    console.log(arg);
  }
}

注:残りのパラメーターの前に通常のパラメーターを渡すことができます

const example = (arg1, ...args) => {
  console.log(arg1);
  for (arg in args) {
    console.log(arg);
  }
}

0

Spread / Rest演算子を使用してパラメーターを配列に収集するlengthと、配列のは渡したパラメーターの数になります。

function foo(...names) {
    console.log(names);
    return names;
}

console.log(foo(1, 2, 3, 4).length);

BabelJSを使用して、関数をoldschoolJSに変換しました。

"use strict";

function foo() {
  for (var _len = arguments.length, names = new Array(_len), _key = 0; _key < _len; _key++) {
    names[_key] = arguments[_key];
  }

  console.log(names);
  return names;
}

0

スプレッド/レスト演算子を使用して関数を作成でき、それ以降、目標を達成しました。以下のチャンクをご覧ください。

const print_names = (...args) => args.forEach(x => console.log(x));


-4

私はこれをするのが好きです:

これは、引数の数がわからない場合は役に立ちませんが、引数の順序を覚えたくない場合は役立ちます。

/**
 *  @param  params.one        A test parameter
 *  @param  params.two        Another one  
 **/
function test(params) {

    var one = params.one;
    if(typeof(one) == 'undefined') {
        throw new Error('params.one is undefined');
    }

    var two = params.two;
    if(typeof(two) == 'undefined') {
        throw new Error('params.two is undefined');
    }
}

1
質問は、不明な数の引数についてでした。
エイドリアンによるデザイン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.