所以,我对Javascript很陌生,并且想知道使用NodeJS的arguments
对象(可能是对语言不熟悉的人)。
考虑一下这个简单实现printf
样式格式
function format(formatString) {
var i = 1;
return formatString.replace(regex, function(match) {
switch(match) {
case "%s": return arguments[i++];
}
});
}
调用函数format("Hi my name is %s. Im %s years old", "Jon", "30")
会产生以下输出My name is 11. Im My name is %s. Im %s years old years old
。
关于arguments
的研究表明我们在这里没有处理“真正的”数组,并且使用Array.slice(arguments)
实际上产生了一个。但是,我正在努力遵循以下事实:
执行这个简单的作业var args = arguments
而不是引用args
而不是arguments
让我的代码完美运行(我偶然发现了检查util.format
的NodeJS来源
我的问题是现在,V8在这里练习什么样的黑魔法?是否在后台执行了任何转换?如果,转换是什么样的? Node告诉我两个变量都是object
类型。
先谢谢你帮助我。
答案 0 :(得分:2)
这不起作用。 arguments
仅表示函数内部的任何内容。在您的情况下,arguments
引用匿名函数的参数。您需要捕获父作用域中的参数。类似的东西:
function format(formatString) {
var i = 1, args = Array.prototype.slice.call(arguments);
return formatString.replace(/%[a-z]/gi, function(match) {
switch(match) {
case "%s": return args[i++];
}
});
}
format("Hi my name is %s. Im %s years old", "Jon", "30");
// Output: "Hi my name is Jon. Im 30 years old"