Javascript 使用无限可选参数包装console.log

Javascript 使用无限可选参数包装console.log,javascript,ecmascript-6,Javascript,Ecmascript 6,我正在尝试创建一个定制的记录器,它只包装了一个控制台.log,但总是在开始时添加一些东西,这样就可以清楚地知道日志来自我的插件 我想出了以下代码: var log = function(param1, param2) { if (typeof param3 !== 'undefined') { console.log('[MyPlugin]', param1, param2, param3); } else if (typeof param2 !== 'undef

我正在尝试创建一个定制的记录器,它只包装了一个
控制台.log
,但总是在开始时添加一些东西,这样就可以清楚地知道日志来自我的插件

我想出了以下代码:

var log = function(param1, param2) {
    if (typeof param3 !== 'undefined') {
        console.log('[MyPlugin]', param1, param2, param3);
    } else if (typeof param2 !== 'undefined') {
        console.log('[MyPlugin]', param1, param2);
    }
};
这允许开发人员运行以下操作:

log('foo', 'bar');
// Outputs '[MyPlugin] foo bar'

log('foo');
// Outputs '[MyPlugin] foo'
但我希望这方面能够有所改进

这一实施的问题是:

  • 日志功能只允许两个参数。如果它能接受很多,那就更好了
  • 有很多重复(多个
    console.log
    调用)
  • 我尝试过的。

    我想这可能会奏效:

    var log = function(...params) {
        console.log('[MyPlugin]', params);
    };
    
    允许开发人员运行:

    log('foo', 'bar');
    // Outputs '[MyPlugin] Array [ "foo", "bar" ]'
    
    log('foo');
    // Outputs '[MyPlugin] Array [ "foo" ]'
    
    您可以看到输出与原始函数中的不同

    有更好的解决方案吗?

    如果您使用它,扩展符号(它不是运算符)确实可以做到这一点。您使用的是rest表示法(将参数收集到数组参数中),而不是扩展表示法(在将参数传递到
    console.log
    时扩展参数)。以下是您如何使用spread:

    var log = function(...params) {
    // Rest -----------^^^
        console.log('[MyPlugin]', ...params);
        // Spread ----------------^^^
    };
    
    例如:

    var log=函数(…参数){
    //休息-----------^^^
    log(“[MyPlugin]”,…参数);
    //散布---------------^^^
    };
    
    日志(“测试”,1、2、3)哇,太完美了!答案很简单,也感谢非ES2015。你太快了,我还不能接受答案!