这是来自John Resigs Learning Advanced JavaScript http://ejohn.org/apps/learn/#40的示例#40。它被称为使用Variable Number of Arguments To Our Advantage.
如果你能帮忙(谢谢你),我有几个问题
1)在这个函数的第4行root[key] = arguments[i][key];
是“root”和“arguments”完全相同,因为“arguments”是一个保留字,包含传递给函数和“root”的所有参数是给参数的名字?
2)root[key] = arguments[i][key]; What exactly is the code doing in this line? Since "root" and "arguments" are already the same (as I guess above), isn
这条线是多余的? IsN只是说var合并的属性是相同的,即“name”=“name”和“city”=“city”?
3)在第二个断言中,他说“城市已被复制”。对于第一个断言,他是否还说过“这个名字被复制了”?即。同样的事情发生在“名称”作为“城市”的功能,对吗?换句话说,他可以在两个断言中说“原始名称完整”,“原始城市是完整的” - 即他们都经历了相同的过程?
4)看看这个例子的标题,“使用可变数量的参数对我们有利”,这个例子如何表明我们可以使用可变数量的参数来获得优势?是否只是所有参数都存储在“参数”中,然后可以作为数组遍历?
function merge(root){
for ( var i = 0; i < arguments.length; i++ )
for ( var key in arguments[i] )
root[key] = arguments[i][key];
return root;
}
var merged = merge({name: "John"}, {city: "Boston"});
assert( merged.name == "John", "The original name is intact." );
assert( merged.city == "Boston", "And the city has been copied over." );
答案 0 :(得分:4)
1)在这个函数的第4行root [key] = arguments [i] [key];是“根”和“参数”完全相同
没有。 root
与arguments[0]
相同,而非arguments
2)root [key] = arguments [i] [key];代码在这一行中究竟做了什么?由于“root”和“arguments”已经相同(如上所述),这条线是不是多余了?
仅当i
为0
时。如果从1
3)在第二个断言中,他说“城市已被复制”。对于第一个断言,他是否也曾说过“这个名字被复制了”?
不是真的,因为它被分配给自己,所以仍然只有一个实例。
4)看看这个例子的标题,“使用可变数量的参数对我们有利”,这个例子如何表明我们可以使用可变数量的参数来获得优势?是否只是所有参数都存储在“参数”中,然后可以作为数组遍历?
它可能更好地标题为“使用JavaScript的能力来处理函数的变量和任意数量的参数对我们有利”,但这将是相当漫长的。
答案 1 :(得分:2)
他正在利用这样一个事实:在Javascript中你可以传递比在函数定义中声明的更多的参数。这些额外的参数可以通过传递给所有函数的arguments
数组访问。
在这种情况下,root
是命名的第一个参数,但可能有更多未命名的参数。
他在这里传递两个论点:
var merged = merge({name: "John"}, {city: "Boston"});
所以root
是对象{name: "John"}
,但arguments
是包含两个对象的数组
#4的回答基本上是是。