改变function参数

想检查传递给函数的参数,并replace没有指定的或者“我不喜欢”的参数。 为此,我做了以下的事情(我想使用arguments的原因是我想有一个generics函数做这个)(与node.js相同的结果,只需将logging器更改为控制台):

 function argtest (x,y,z) { Logger.log ("at begin x="+x+", y="+y+", z="+z); arguments.length=3; // found this somewhere, doesn't help arguments[0]="a"; arguments[1]="b"; arguments[2]="c"; Logger.log ("arguments now:"); for (var i in arguments) { Logger.log ("arguments["+i+"]="+arguments[i]); } Logger.log ("at end x="+x+", y="+y+", z="+z); } function callArgTest () { argtest (); argtest (1,2,3); } 

所以调用callArgTest的结果是:

 Logger.log([at begin x=undefined, y=undefined, z=undefined, []]) Logger.log([arguments now:, []]) Logger.log([arguments[0]=a, []]) Logger.log([arguments[1]=b, []]) Logger.log([arguments[2]=c, []]) Logger.log([at end x=undefined, y=undefined, z=undefined, []]) Logger.log([at begin x=1, y=2, z=3, []]) Logger.log([arguments now:, []]) Logger.log([arguments[0]=a, []]) Logger.log([arguments[1]=b, []]) Logger.log([arguments[2]=c, []]) Logger.log([at end x=a, y=b, z=c, []]) 

所以参数x,y,z只在初始指定时才会改变。 在第一种情况下(调用没有参数的argtest ),即使给参数赋值,它们仍然是未定义的。 那么这里缺less什么来使其工作? 请注意,我不想触摸x,y,z。 相反,在最后的实现中,我想把parameter passing给一个对它们有效的函数。

问题是,当调用argtest()arguments实际上并不具有"0"属性来引用x ,或者"1"具有y等。

 argtest() => arguments = { "length": 0 } argtest(1,2,3) => arguments = { "length": 3, "0": x, "1": y, "2": z } 

该引用的定义在ES5 10.6的步骤11.c进行了描述,它为arguments每个“索引”定义了getter和setter,但受限于参数个数和传递的参数个数。

关于你的意图:

我想在函数的开始处插入一个现有的实现,调用一个只需要参数和一些默认值作为参数的函数,例如defaults (arguments, "string=nana", "number=4")

你可能会更容易find这样的事情:

 function argTest(x, y, z) { x = typeof x !== 'undefined' ? x : ...; y = typeof y !== 'undefined' ? y : ...; // etc. } 

你想要做什么是可能的ES5,但将意味着定义你自己的“参数”对象与getter和setter的每个“索引”和命名参数,无论是否通过值,通过Object.create / Object.definePropertiesget / set – ,我不会考虑这个“ 简单 ”:

 function argtest(x, y, z) { defaults({ length: argtest.length, get '0'() { return x; }, set '0'(val) { x = val; }, get '1'() { return y; }, set '1'(val) { y = val; }, get '2'() { return z; }, set '2'(val) { z = val; } }, ...); // ... } 

 arguments[0]="a"; arguments[1]="b"; arguments[2]="c"; 

你为什么不添加

 x = arguments[0]; y = arguments[1]; z = arguments[2]; 

? 我想有一些原因,为什么这不符合你的目标,但我想我需要一个更现实的例子,以看看真正能达到你的目标。

也许你可以做这样的事情:

 var args = Array.prototype.slice.call(arguments); 

然后和args工作? 你可以将args传递给你需要的其他函数。 让我知道这是否帮助你,或者如果我吠叫错了树。