是否可以将函数的所有参数作为该函数内的单个对象获取?

IT技术 javascript algorithm function arguments marshalling
2021-02-10 09:32:20

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

6个回答

使用arguments. 您可以像访问数组一样访问它。使用arguments.length的参数的数目。

这仅适用于传统的 JavaScript function,不适用于 ES2015+ 粗箭头=>函数。对于这些,你会想用...args函数定义,像这样:(...args) => console.log(args)
2021-03-17 09:32:20
David:当使用 SCRIPT 标记将 JavaScript 文件包含在 HTML 中时,window.location 未按预期设置。使用此方法将丢失任何参数。
2021-03-22 09:32:20
<script src="name.js?disableSending=1&testInstantly=1"></script>“未捕获的引用错误:未定义参数”
2021-03-23 09:32:20

所述参数类似阵列的对象(不是实际的阵列)。示例函数...

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

试试看...

testArguments("This", "is", "a", "test");  // outputs ["This","is","a","test"]
testArguments(1,2,3,4,5,6,7,8,9);          // outputs [1,2,3,4,5,6,7,8,9]

完整细节:https : //developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments

我添加了一个简单描述的链接:“类数组对象”只是一个“具有非负整数长度属性的对象,通常还有一些索引属性。” 来自 mozilla 链接:“它类似于数组,但除了长度之外没有任何数组属性。”
2021-03-17 09:32:20
为什么不把结果也贴在这里呢?:)
2021-03-21 09:32:20
这比接受的答案要好得多,因为它包含一个工作代码片段并显示输出。接受的答案太稀疏了。
2021-03-29 09:32:20
很好的答案......将是一个很好的答案,扩展“不是一个实际的数组”
2021-04-03 09:32:20

ES6 允许使用“...”符号指定函数参数的构造,例如

function testArgs (...args) {
 // Where you can test picking the first element
 console.log(args[0]); 
}
@DavidBaucum 是正确的。因为箭头函数不会创建新的作用域,而“参数”是从作用域中收集的。但最坏的情况不是 ReferenceError。这是从外部范围收集的“参数”。然后你不会有例外,也许你的应用程序中会有奇怪的错误。
2021-03-14 09:32:20
这也称为“其余参数”,请参阅developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-03-22 09:32:20
这似乎是使用箭头函数的唯一方法。a = () => {console.log(arguments);}; a('foo');-- Uncaught ReferenceError: arguments is not defined 然而a = (...args) => {console.log(args);}; a('foo');["foo"]
2021-03-28 09:32:20

arguments对象是函数的参数的存储位置。

arguments 对象的行为和看起来像一个数组,它基本上是,它只是没有数组所做的方法,例如:

Array.forEach(callback[, thisArg]);

Array.map(callback[, thisArg])

Array.filter(callback[, thisArg]);

Array.slice(begin[, end])

Array.indexOf(searchElement[, fromIndex])

我认为将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
> value === 1
> value === Object {}
> value === two
>value === 3

[].slice.apply(arguments); 不能是最好的方法,因为它会导致不必要的空数组分配。
2021-03-28 09:32:20

如果您愿意,也可以将其转换为数组。如果 Array 泛型可用:

var args = Array.slice(arguments)

否则:

var args = Array.prototype.slice.call(arguments);

来自Mozilla MDN

您不应该对参数进行切片,因为它会阻止 JavaScript 引擎(例如 V8)中的优化。

感谢更新。使用 JSON.stringify 和 JSON.parse 作为替代:function foo() { foo.bar = JSON.stringify(arguments); foo.baz = JSON.parse(foo.bar); } 如果需要保留而不是字符串化,请使用内部结构化克隆算法如果传递 DOM 节点,请使用 XMLSerializer 作为无关的问题with (new XMLSerializer()) {serializeToString(document.documentElement) }
2021-04-06 09:32:20