Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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_Algorithm_Function_Arguments_Marshalling - Fatal编程技术网

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

在PHP中,JavaScript有类似的东西吗?

使用。您可以像访问数组一样访问它。使用
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}