Javascript命名函数参数与对象参数

Javascript命名函数参数与对象参数,javascript,arguments,Javascript,Arguments,如果我有这样的功能: function doStuff(arg) { arguments[0] = "4" + arg; console.log(arg); console.log.apply(null, arguments); } 显然,doStuff(“name”)会打印两次“4name” arg和参数[0]是否指向同一事物?我可以互换使用吗。javascript是否在内部做了我应该注意的事情,是否存在任何问题 我知道参数处理的是所有传递的参数,而不仅仅是命名参数。我只关

如果我有这样的功能:

function doStuff(arg) {
   arguments[0] = "4" + arg;
   console.log(arg);
   console.log.apply(null, arguments);
}
显然,
doStuff(“name”)
会打印两次“4name”

arg
参数[0]
是否指向同一事物?我可以互换使用吗。javascript是否在内部做了我应该注意的事情,是否存在任何问题

我知道参数处理的是所有传递的参数,而不仅仅是命名参数。我只关心它如何处理第一个(或第n个)参数

[编辑]

我实际上是在用这个来做实验

function name(arg) {
   arguments[1] = args;
   arguments[0] = "[INFO] " + args.callee + " arg: %o";
   console.log.apply(this, arguments);
}
在函数本身中调用
name(参数)
。有趣的是,args.callee打印出的是函数源代码,而不是函数名。

参数“array”存在于任何函数上下文中,并枚举当前上下文调用接收到的参数。Yes arguments[0]引用了给定的第一个参数,因此如果您将其标记为“name”,则它将是相同的

Arguments对于处理未定义数量的参数(即参数列表)、元编程,甚至是您想要施加一些启发来确定哪些参数代表什么类型的数据(即您不信任实现者)非常强大,但至少可以说,这是一个相当有限的用例

我强烈建议您避免依赖arguments数组,原因有两个:

1) 。指数仓位并不是一个非常安全的机制来依赖这些数据——实际上就是你所认为的数据,也不是一个灵活的机制来处理变化

2) 。如果删除命名参数,则实际上是在销毁信息。尽管JS函数签名不像其他语言中的签名那样严格,但对于任何试图理解函数实际功能的人来说,它仍然是至关重要的信息。JS是一种表达能力非常重要的语言

上述参数还包含其他有趣的属性,例如“callee”,它将为您提供一些相当大的能力,使您能够完成其他方法无法完成的事情。这是值得你自己调查的(好的起点)

还有一个更严重的问题,参数本身处于一种奇怪的半弃用、半支持状态,因此在使用它的地方确实需要进行x-browser测试并记录以供将来考虑


我知道没有内部陷阱。

是的,您可以互换使用它们

下面是一个关于如何使用
参数的好文档:

是,
参数[0]
arg
指向同一事物,改变一个会改变另一个。ECMAScript 5(目前正逐渐进入主流浏览器)稍微改变了一些事情:在严格模式下,命名参数和
参数
对象之间的关联比较松散,因为
参数
中的值只是命名参数的副本。摘自ECMAScript 5第10.6节:

对于严格模式函数,arguments对象属性的值只是传递给函数的参数的副本,并且属性值和形式参数值之间没有动态链接


参数
对象本身作为函数中的局部变量未被弃用。谢谢,如果调用不正确,函数将显示奇怪的行为。我能应付。我主要是将参数与.apply和arguments.callee函数结合使用,因此使用它很重要。作为开发人员,应该提前考虑并尝试处理ECMAscript 5的更改,还是只在实现中的更改破坏它时才修复它。@Raynos-始终提前;)如果你知道这一点,那么这肯定是一个你可以计划的问题。