1

以前に指定されたオプションのパラメーターに基づいてargumentsaを修正する関数を作成しようとしています。function私は問題に来ました。arguments以前に何らかの方法で定義されていない限り、配列を介して変数を設定できないようです。以下のコードは、私が直面している問題の例を示しています。

function foo(a, b, c) {
    arguments[0] = "lorem";
    arguments[1] = "ipsum";
    arguments[2] = "dolor";

    console.log([a, b, c]);
}

foo(null);              // ["lorem", undefined, undefined]
foo(null, null);        // ["lorem", "ipsum",   undefined]
foo(null, null, null);  // ["lorem", "ipsum",   "dolor"]

ただし、結果をログに記録するときargumentsは常に["lorem", "ipsum", "dolor"]です。
この問題を解決する方法はありますか?

で呼び出された関数はこれらの名前にアクセスできないためabc直接設定することはできません。 私の目標は次のようになります。foo

function foo(a, b, c) {
    var rules = [];
    // Rule for optional parameter 1 (b)
    // If it equals true the value of b is shifted to the next parameter (c)
    rules[1] = function(val) { return val !== "ipsum"; };
    optionalize(rules);

    console.log([a, b, c]);
}

foo("lorem", "dolor"); // ["lorem", undefined, "dolor"];
4

4 に答える 4

2

配列は実際にはarguments配列ではなく、「配列のような」オブジェクトです。長さを変更することはできません。

あなたがやろうとしていることは、通常、

a = a || "lorem";

または、「偽の」引数を置き換えたくない場合は、

if (typeof a === "undefined") a = "lorem";
于 2012-12-30T15:22:28.100 に答える
0

ちょっと変わっていますが、これはあなたが考えていたものですか?

function optionalize(fn, options) {
    var i, key, rule;
    for(i = 0; i < options.length; i += 1) {
        key = fn.placement[i];
        rule = fn.ruleset[key];

        // If the rule exists and returns true, shift value to the right.
        if(rule && rule(options[i])) {
            options[i+1] = options[i];
            options[i] = undefined;
        }

        // Assign the numeric index to an alphabet key.
        // Depending on your use case, you may want to substitute a plain Object here and return that, instead of adding non-numeric properties to an Array.
        options[key] = options[i];
    }
}

// Test function
function foo(a, opts) {
    opts = opts || [];
    optionalize(foo, opts);

    console.log([a, opts.b, opts.c]);
}

// Optional argument names, in the order that they would be received.
foo.placement = ['b', 'c'];

// Optionalize rules
foo.ruleset = {
    b: function (val) { return val !== "ipsum"; }
};


// Demonstration
foo('lorem');
foo('lorem', []);
foo('lorem', ['dolor']);
foo('lorem', ['ipsum', 'dolor']);

dystroyの答えがすでに示しているように、arguments変数は実際の配列ではなく、変更するのは良い考えではないかもしれません。arguments単純なJavaScriptを使用して可能な限り、基準に依存せず、基準を満たすソリューションを提供しました。

関数fooは、必須の引数aと、それに続く。という名前のオプションの引数の配列で指定されoptsます。オプションのize仕様は、およびプロパティfooを介してに設定されます。オプションのize関数はこの情報を受け取り、配列のインデックスを使用可能な名前キーに変換し、必要に応じてルールを適用します。placementruleset

于 2012-12-30T17:00:39.873 に答える
0

何をしようとしているのかわかりませんが、arguments[0] = a ? のようなものです。a : "lorem" など ?

于 2012-12-30T15:26:08.640 に答える
0

引数を配列に変換できます

function foo () {
     var arguments = Array.prototype.slice.call(arguments);
     arguments.push(4);
     console.log(arguments);
}
foo(1,2,3);

</p>

于 2012-12-30T16:18:16.247 に答える