Javascript 循环迭代的神秘性
在下面的代码中,for循环以i=1开始。合并对象的name属性是如何正确设置的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
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:你没有错。只是第一个参数中的对象既是输入(作为第一个参数)又是输出(作为所有其他参数合并到的对象)。这是个忙碌的小东西。