Javascript 是否可以将函数的所有参数作为该函数中的单个对象获取?
在PHP中,JavaScript有类似的东西吗?使用。您可以像访问数组一样访问它。使用Javascript 是否可以将函数的所有参数作为该函数中的单个对象获取?,javascript,algorithm,function,arguments,marshalling,Javascript,Algorithm,Function,Arguments,Marshalling,在PHP中,JavaScript有类似的东西吗?使用。您可以像访问数组一样访问它。使用arguments.length作为参数数。参数是(不是实际数组)。示例函数 function testArguments () // <-- notice no arguments specified { console.log(arguments); // outputs the arguments to the console var htmlOutput = ""; for
arguments.length
作为参数数。参数是(不是实际数组)。示例函数
function testArguments () // <-- notice no arguments specified
{
console.log(arguments); // outputs the arguments to the console
var htmlOutput = "";
for (var i=0; i < arguments.length; i++) {
htmlOutput += '<li>' + arguments[i] + '</li>';
}
document.write('<ul>' + htmlOutput + '</ul>');
}
完整详细信息:在ES6中,使用
数组
function foo()
{
foo.bar = Array.from(arguments);
foo.baz = foo.bar.join();
}
foo(1,2,3,4,5,6,7);
foo.bar // Array [1, 2, 3, 4, 5, 6, 7]
foo.baz // "1,2,3,4,5,6,7"
对于非ES6代码,请使用JSON.stringify和JSON.parse:
function foo()
{
foo.bar = JSON.stringify(arguments);
foo.baz = JSON.parse(foo.bar);
}
/* Atomic Data */
foo(1,2,3,4,5,6,7);
foo.bar // "{"0":1,"1":2,"2":3,"3":4,"4":5,"5":6,"6":7}"
foo.baz // [object Object]
/* Structured Data */
foo({1:2},[3,4],/5,6/,Date())
foo.bar //"{"0":{"1":2},"1":[3,4],"2":{},"3":"Tue Dec 17 2013 16:25:44 GMT-0800 (Pacific Standard Time)"}"
foo.baz // [object Object]
如果需要保存而不是严格化,请使用
如果传递了DOM节点,请在中使用XMLSerializer
如果作为bookmarklet运行,您可能需要将每个结构化数据参数包装在JSON.stringify
的错误构造函数中才能正常工作
参考资料
参数对象是存储函数参数的地方
arguments对象的行为和外观类似于数组,它基本上是这样的,只是没有数组所具有的方法,例如:
我认为将参数
对象转换为实际数组的最佳方法如下:
argumentsArray = [].slice.apply(arguments);
这将使它成为一个数组
可重复使用:
function ArgumentsToArray(args) {
return [].slice.apply(args);
}
(function() {
args = ArgumentsToArray(arguments);
args.forEach(function(value) {
console.log('value ===', value);
});
})('name', 1, {}, 'two', 3)
结果:
>value==name
>值===1
>value==对象{}
>value==two
>值===3
如果愿意,也可以将其转换为数组。如果阵列泛型可用:
var args = Array.slice(arguments)
否则:
var args = Array.prototype.slice.call(arguments);
发件人:
您不应该对参数进行切片,因为它会阻止在中进行优化
JavaScript引擎(例如V8)
正如许多其他人指出的,参数
包含传递给函数的所有参数
如果要使用相同的参数调用另一个函数,请使用apply
例如:
var is_debug = true;
var debug = function() {
if (is_debug) {
console.log.apply(console, arguments);
}
}
debug("message", "another argument")
是的,如果您不知道在函数声明时可能有多少个参数,那么您可以声明不带参数的函数,并且可以通过在函数调用时传递的参数数组访问所有变量。ES6允许使用“…”指定函数参数的构造符号,例如
function testArgs (...args) {
// Where you can test picking the first element
console.log(args[0]);
}
与Gunnar的答案类似,还有更完整的示例:
您甚至可以透明地返回整个内容:
function dumpArguments(...args) {
for (var i = 0; i < args.length; i++)
console.log(args[i]);
return args;
}
dumpArguments("foo", "bar", true, 42, ["yes", "no"], { 'banana': true });
在ES6中,您可以执行以下操作:
函数foo(…args)
{
设[a,b,…c]=args;
控制台日志(a、b、c);
}
foo(1,空,“x”,真,未定义)代码>为什么不把结果也贴在这里呢?:)这比公认的答案要好得多,因为它包含一个工作代码段并显示输出。接受的答案太稀疏了。好答案…如果扩展到“非实际数组”,将是一个很好的答案。我在一个简单的描述中添加了一个链接:“类似数组的对象”只是一个“具有非负整数长度属性的对象,通常具有一些索引属性。”来自mozilla链接:它类似于数组,但除了长度之外没有任何数组属性。“首先:这将克隆传入的任何对象。第二:并非所有内容都可以字符串化为JSON。也就是说:函数,DOM对象,所说的日期字符串化…@JanDvorak你能用一个处理DOM对象,函数和日期的函数来编辑我的答案吗?+1,试图将错误报告的参数作为字符串传递,该对象最终成为字符串“[object arguments]”,并且记录到控制台时不会显示值。虽然它似乎没有回答OP,但它确实回答了我的问题,谢谢!谢谢你的更新。使用JSON.stringify和JSON.parse作为替代:函数foo(){foo.bar=JSON.stringify(参数);foo.baz=JSON.parse(foo.bar);}
如果需要保存而不是字符串化,请使用。如果传递了DOM节点,请在中使用XMLSerializer<代码>使用(新的XMLSerializer()){serializeToString(document.documentElement)}
这似乎是使用arrow函数的唯一方法<代码>a=()=>{console.log(参数);};a(“foo”)
给出了--未捕获引用错误:未定义参数
但是a=(…args)=>{console.log(args);};a(“foo”)
给出了正确的[“foo”]
@DavidBaucum。因为arrow函数不创建新的作用域,并且“参数”是从作用域收集的。但最坏的情况不是参考错误。这是因为“参数”是从外部范围收集的。然后,您的应用程序中不会出现异常,可能会出现奇怪的错误。这也称为“rest参数”,请参阅。[].slice.apply(参数)
不是最好的方法,因为它会导致不必要的空数组分配。这只适用于传统的JavaScript函数
,而不是ES2015+fat arrow=>
函数。对于这些,您需要在函数定义中使用…args
,例如:(…args)=>console.log(args)
。您甚至可以执行``函数foo(a,b,…c){console.log(a,b,c);}```
function testArgs (...args) {
// Where you can test picking the first element
console.log(args[0]);
}
function dumpArguments(...args) {
for (var i = 0; i < args.length; i++)
console.log(args[i]);
return args;
}
dumpArguments("foo", "bar", true, 42, ["yes", "no"], { 'banana': true });
foo
bar
true
42
["yes","no"]
{"banana":true}