在下面的代码中,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
这怎么可能?
答案 0 :(得分:3)
参数root
引用对象{name: "John"}
。这也是arguments[0]
。这就是为什么我们跳过它并从arguments[1]
开始 - 所有后续参数都合并到它中。
答案 1 :(得分:2)
您可能错过了一个事实,即您的方法接受一个参数然后返回
function merge(root) {
...
return root
这样当你用
喂它时merge( {name: "John"}, ...
它将{name: "John"}
用作root
并将其他参数合并到其中。