然后应用参数的前置参数

时间:2014-04-24 10:44:51

标签: javascript arguments call apply

我有一个函数message,它接受​​一个参数来定义消息的类型,然后它连接任何其他参数以形成消息,纯粹是一个精确的。

看起来像这样:

function message(type) {
    var msg = _.rest(arguments).join(" ");

    // Really the type will be used to set the class on a div
    // But I'm just using console.log to keep it simple for now.
    console.log(type + ": " + msg);
}

我想提供帮助函数errorwarninginfo,只需使用正确的类型调用message即可。我只是不确定最好的方法来解决这个问题。我不能想到两种方法,但我不确定我是否正确地解决了这个问题,或者我可能会过度复杂化。

第一种方式看起来有点多余,创建一个包含第一个arg的新数组,然后将参数压平。

message.apply(this, _.flatten(["error", arguments]));

第二种方式感觉有点......凌乱?

Array.prototype.unshift.call(arguments, "error");
message.apply(this, arguments);

虽然来自我的经历:

(function() {
    Array.prototype.unshift.call(arguments, 0);
    console,log(arguments);
})(1, 2, 3);

我得到以下输出:

[0, 1, 2, 3, undefined, undefined, undefined, ..., undefined]

2 个答案:

答案 0 :(得分:8)

var args = Array.prototype.slice.call(arguments); // Make real array from arguments
args.unshift("error");
message.apply(this, args);

请参阅How can I convert the "arguments" object to an array in JavaScript?

答案 1 :(得分:5)

在ES5中,这可能比首先转换为真实数组然后unshift更有效:

var args = Array.prototype.concat.apply(["error"], arguments);
message.apply(this, args);

编辑:最好避免扁平化输入数组:

var args = ["error"];
args.push.apply(args, arguments);
message.apply(this, args);