神秘的for循环迭代

时间:2014-04-22 19:43:16

标签: 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];
    }
  }
  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 

如果我使用i = 2设置循环开始,merged.city会返回undefined(正如预期的那样),而merged.name仍会返回&#34; John&#34;。< / p>

function merge(root){
  for ( var i = 2; i < arguments.length; i++ ){
    for ( var key in arguments[i] ){
      console.log(i); // returns 2
      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 ); // undefined - OK
console.log( merged.age ); // 13 - OK

这怎么可能?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

您可能错过了一个事实,即您的方法接受一个参数然后返回

function merge(root) {
  ...
  return root

这样当你用

喂它时
merge( {name: "John"}, ...

它将{name: "John"}用作root并将其他参数合并到其中。