【问题标题】:Mysterious for-loop iteration神秘的for循环迭代
【发布时间】:2014-06-07 08:47:45
【问题描述】:

在下面的代码中,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 仍返回“John”。

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

这怎么可能?

【问题讨论】:

    标签: javascript for-loop arguments


    【解决方案1】:

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

    function merge(root) {
      ...
      return root
    

    这样当你喂它时

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

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

    【讨论】:

    • 这是正确的,使用console.log(JSON.stringify(merged)) 来检查你的变量。
    【解决方案2】:

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

    【讨论】:

    • 知道了。我认为参数root 指的是一个包含所有参数的对象 - 如果我在函数中使用console.log(root),这就是它返回的内容。
    • @zok:嗯,你没看错。只是第一个参数中的对象既是输入(作为第一个参数)又是输出(作为所有其他参数合并到的对象)。这是一个忙碌的小物件。
    猜你喜欢
    • 2014-10-23
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    相关资源
    最近更新 更多