Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.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/5/date/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_For Loop_Arguments - Fatal编程技术网

Javascript 循环迭代的神秘性

Javascript 循环迭代的神秘性,javascript,for-loop,arguments,Javascript,For Loop,Arguments,在下面的代码中,for循环以i=1开始。合并对象的name属性是如何正确设置的 function merge(root){ for ( var i = 1; i < arguments.length; i++ ){ for ( var key in arguments[i] ){ console.log(i); // returns 1 then 2 (not 0) root[key] = arguments[i][key]; } } r

在下面的代码中,for循环以i=1开始。合并对象的name属性是如何正确设置的

function merge(root){
  for ( var i = 1; i < arguments.length; i++ ){
    for ( var key in arguments[i] ){
      console.log(i); // returns 1 then 2 (not 0)
      root[key] = arguments[i][key];
    }
  }
  return root;
}

var merged = merge({name: "John"}, {city: "Boston"},{age: 13});
console.log( merged.name ); // "John" ?
console.log( merged.city ); // "Boston" - OK 
console.log( merged.age ); // 13 - OK 

这怎么可能呢?

参数
root
指的是对象
{name:“John”}
。这也是参数[0]。这就是为什么我们跳过它,从
参数[1]
开始-所有后续参数都合并到它中。

参数
引用对象
{name:“John”}
。这也是参数[0]。这就是为什么我们跳过它,从
参数[1]
开始-所有后续参数都合并到它中。

您可能忽略了这样一个事实,即您的方法接受一个参数,然后返回

function merge(root) {
  ...
  return root
所以当你给它喂食

merge( {name: "John"}, ...

它将使用
{name:“John”}
作为
并将其他参数合并到其中。

您可能忽略了这样一个事实,即您的方法接受一个参数,然后返回该参数

function merge(root) {
  ...
  return root
所以当你给它喂食

merge( {name: "John"}, ...

它将使用
{name:“John”}
作为
并将其他参数合并到其中。

这是正确的,使用
console.log(JSON.stringify(merged))
检查变量。这是正确的,使用
console.log(JSON.stringify(merged))
检查变量。明白了。我认为参数
root
引用了一个包含所有参数的对象-如果我在函数中使用
console.log(root)
,它会返回这些参数。@zok:你没有错。只是第一个参数中的对象既是输入(作为第一个参数)又是输出(作为所有其他参数合并到的对象)。这是个忙碌的小东西,明白了。我认为参数
root
引用了一个包含所有参数的对象-如果我在函数中使用
console.log(root)
,它会返回这些参数。@zok:你没有错。只是第一个参数中的对象既是输入(作为第一个参数)又是输出(作为所有其他参数合并到的对象)。这是个忙碌的小东西。