通过参数设置未定义的参数

时间:2012-12-30 15:21:10

标签: javascript parameters arguments

我正在尝试编写一个函数,根据以前指定的可选参数更正arguments的{​​{1}}。我遇到了一个问题。似乎我无法通过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"]ab因为c中调用的函数无法访问这些名称。
我的目标看起来像这样:

foo

4 个答案:

答案 0 :(得分:2)

arguments数组实际上不是数组,而是an "array-like" object。你不能改变它的长度。

您尝试做的事情通常是使用

完成的
a = a || "lorem";

或者,如果您不想使用

替换任何“falsy”参数
if (typeof a === "undefined") a = "lorem";

答案 1 :(得分:0)

我不确定你要做的是什么,但像参数[0] = a? a:“lorem”等等?

答案 2 :(得分:0)

您可以将参数转换为数组

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

答案 3 :(得分: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的可选参数数组。可选的规范通过fooplacement属性设置到ruleset。 optionalize函数获取此信息并将数组的索引转换为可用的名称密钥,并根据需要应用规则。