JavaScript参数对象没有所有参数

时间:2017-06-21 14:19:38

标签: javascript arguments

背景

我正在学习arguments对象在函数内部的工作原理。我注意到理论上,这个对象将传递给函数的所有参数。

在实践中,我有不同的结果。

代码

以下代码是一个测试函数,它打印它收到的参数:

function test(myArgs){
    console.log(`myArgs: ${myArgs}`);
    console.log(`arguments obj: ${JSON.stringify(arguments)}`);
    console.log(`arguments array ${JSON.stringify(Array.from(arguments))}`);
}

第一行打印myArgs,另外两行以不同的方式打印arguments对象。

使用简单的函数执行函数:

test("hello", 56, 60, 5);

myArgs: hello
arguments obj: {"0":"hello","1":56,"2":60,"3":5}
arguments array ["hello",56,60,5]

问题

当我将一个函数作为参数之一传递出来时,问题就出现了,比如说,回调:

test("hello", () => console.log("HelloWorld"), 60, 5);

myArgs: hello
arguments obj: {"0":"hello","2":60,"3":5}
arguments array ["hello",null,60,5]

这是非常意外的......

代码

以下是一个举例说明此行为的代码段:

    function test(myArgs){
    	console.log(`myArgs: ${myArgs}`);
    	console.log(`arguments obj: ${JSON.stringify(arguments)}`);
    	console.log(`arguments array ${JSON.stringify(Array.from(arguments))}`);
    }

test("hello", 56, 60, 5);
test("hello", () => console.log("HelloWorld"), 60, 5);

问题

  1. 为什么这不起作用?
  2. 如果我有多个参数,如何访问函数?

1 个答案:

答案 0 :(得分:3)

默认情况下,JSON.stringify()不会对函数进行序列化。

......但它可以。提供自定义replacer回调并自行处理函数序列化:



var values = [1, false, {foo:2}, function bar() {}];

console.log(JSON.stringify(values, function(key, value) {
  if ("function" === typeof value) {
    return value.toString();
  }
  return value;
}));




请参阅Function.prototype.toString()JSON.stringify(value, replacer)