Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:将数组作为可选方法参数传递_Javascript - Fatal编程技术网

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

Javascript:将数组作为可选方法参数传递,javascript,Javascript,更新:以下是我的解决方案(受公认答案启发): 更新2:更好的解决方案: 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 ); } }

更新:以下是我的解决方案(受公认答案启发):

更新2:更好的解决方案:

 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");
function log(msg, values) {
  if(config.log == true){
    console.log(msg, values);
   }
 }
这是最初的问题:

console.log
获取字符串并用值替换令牌,例如:

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

My name is Dave, and I like Javascript
我想将其封装在如下方法中:

log("Hi my name is %s, and I like %s", "Dave", "Javascript");
function log(msg, values) {
  if(config.log == true){
    console.log(msg, values);
   }
 }
“values”参数可以是单个值或多个可选参数。我怎样才能做到这一点

如果我这样称呼它:

 log("My name is %s, and I like %s", "Dave", "Javascript");
我明白了(它不承认“Javascript”是第三个参数):

如果我称之为:

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

然后,它将第二个参数视为一个数组(它不会扩展到多个参数)。我缺少什么技巧来让它扩展可选参数?

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

在您的示例中,可以获得一个数组,其中包含第一个参数之后的所有参数,如下所示:

var values = Array.prototype.slice.call(arguments, 1);
log("My name is %s, and I like %s", 'Dave', 'Javascript');
编辑: 我很惊讶这不起作用,所以我回去看看上面的一切

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

var values = Array.prototype.slice.call(arguments, 1);
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!=空
工作正常。在IE7里什么都没用,想想吧

原始(错误)答案:

Javascript有一个特殊的“arguments”变量,它完全满足您的需要

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

虽然这与jQuery无关,但我还是可以尝试回答:)

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


@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 );
    }

}
函数日志(消息、值){
如果(未定义!=控制台){
var newArg='';
var newMsg=msg.split(“%s”);
如果(未定义!=值){
对于(i=0;i<(newMsg.length-1);i++){
newArg+=newMsg[i]+值[i];
}
}否则{
newArg=newMsg[0];
}
console.log(newArg);
}
}

这不会满足他的要求。谢谢,了解参数标识符非常方便,这对将来非常有用。谢谢。”“申请”正是我需要的。我用我的解决方案更新了这个问题。虽然这在FF中很有效,但仅供参考,这在Chrome中不起作用,因为它会导致
未捕获类型错误:由于
apply
方法的非法调用
。出于某种原因,Chrome失败可能是因为您正在传递
日志
函数的
this
(可能是
窗口
对象)作为
thisArg
console.log
thisArg
显然应该是
console
。这在Chrome中不起作用,因为输出将是
我的名字是数组,我喜欢%s
。请参阅我的答案,了解一个在两种浏览器中都能工作的函数。刚刚测试过,如果使用
console.log.ap,它在Chrome中工作铺层(控制台,args);
如bobince所指出。