Javascript:将数组作为可选方法args传递

时间:2010-05-31 14:07:04

标签: javascript

更新:这是我的解决方案(灵感来自已接受的答案):

function log(msg, values) {
         if(config.log == true){
         msg = [msg];
         var args = msg.concat(values);
         console.log.apply( this, args );
         }
     }

UPDATE2:更好的解决方案:

 function log(msg) {
     if(config.log == true){
     msg = [msg];
     var values = Array.prototype.slice.call(arguments, 1);
     var args = msg.concat(values);
     console.log.apply( console, args );
     }
 }

你可以这样称呼这个版本:

log("Hi my name is %s, and I like %s", "Dave", "Javascript");

以下是原始问题:

console.log接受一个字符串并用值替换标记,例如:

console.log("My name is %s, and I like %", 'Dave', 'Javascript')

会打印:

My name is Dave, and I like Javascript

我想把它包装在一个像这样的方法中:

function log(msg, values) {
  if(config.log == true){
    console.log(msg, values);
   }
 }

'values'arg可能是单个值或几个可选的args。我怎么能做到这一点?

如果我这样称呼它:

 log("My name is %s, and I like %s", "Dave", "Javascript");

我得到了这个(它不会将“Javascript”识别为第三个参数):

 My name is Dave, and I like %s

如果我这样称呼:

 log("My name is %s, and I like %s", ["Dave", "Javascript"]);

然后它将第二个arg视为一个数组(它不会扩展为多个args)。我错过了什么技巧来扩展可选的args?

4 个答案:

答案 0 :(得分:2)

您正在寻找arguments标识符,它是一个类似于数组的对象(但不是实际数组),其中包含传递给函数的所有参数。

在你的例子中,你可以得到一个包含所有参数的数组,如下所示:

var values = Array.prototype.slice.call(arguments, 1);

答案 1 :(得分:2)

虽然这不是jQuery相关的,但无论如何我都可以尝试回答:)

以下可能有效(未经测试):

function log(msg, values) {
  if(typeof config.log != 'undefined' ) {
    if( typeof values != 'Array' ) {
      values = [values];
    }
    values.unshift( msg );
    console.log.apply( this, values );
  }
}

答案 2 :(得分:1)

@azatoth创建了一个智能答案,但由于在Chrome中不起作用,我会使用简单的字符串连接:

function log(msg, values) {

    if (undefined != console) {
        var newArg = '';
        var newMsg = msg.split('%s');

        if (undefined != values) {
            for (i=0; i < (newMsg.length-1); i++) {
                newArg += newMsg[i] + values[i];
            }
        } else {
            newArg = newMsg[0];
        }

        console.log( newArg );
    }

}

答案 3 :(得分:-2)

编辑: 我很惊讶这没用,所以我回去看了上面的所有内容。

戴夫,如果你想这样称呼:

log("My name is %s, and I like %s", 'Dave', 'Javascript');

然后最简单的解决方案就是:

function log() {
    if(console.log !== null){
        console.log.apply(console,arguments);
    }
}

哦,console.log == true对我来说无法在FF或Chrome中运行。只有console.log != null有效。在IE7中没有任何工作,请参见图。

ORIGINAL(不好)回答:

Javascript有一个特殊的'arguments'变量,可以完全满足您的需求。

   function log(msg, arguments) {
       if(config.log == true){
         console.log(msg, arguments);
       }
   }