想要检查传递给函数的参数并替换未指定的参数或“我不喜欢”的参数。为此,我做了以下(我想使用arguments
的原因是我希望有一个通用函数)(与node.js相同的结果,只需将Logger更改为控制台):< / p>
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
),即使将值赋给参数,它们仍然未定义。那么这里缺少什么让它起作用?请注意,我不想触摸x,y,z。相反,在最终的实现中,我想将参数传递给一个适用于它们的函数。
答案 0 :(得分:1)
问题在于,在调用argtest()
时,arguments
实际上没有"0"
属性来引用x
或"1"
来{ {1}}等等:
y
ES5 10.6的步骤argtest() => arguments = { "length": 0 }
argtest(1,2,3) => arguments = { "length": 3, "0": x, "1": y, "2": z }
中描述了该引用的定义,它定义了11.c
的每个“索引”的getter和setter,但受参数数量的限制named和传递的参数数量。
关于你的意图:
我想在函数开头的现有实现中调用一个函数,该函数只接受参数和一些默认值作为参数,例如:
arguments
你可能会更容易找到这样的东西:
defaults (arguments, "string=nana", "number=4")
你想用ES5做什么,但是意味着用每个“索引”和命名参数的getter和setter定义你自己的“arguments”对象,无论是否传递值,都通过Object.create
/ Object.defineProperties
或get
/ set
- 我不会认为这是“简单”:
function argTest(x, y, z) {
x = typeof x !== 'undefined' ? x : ...;
y = typeof y !== 'undefined' ? y : ...;
// etc.
}
答案 1 :(得分:0)
在
arguments[0]="a";
arguments[1]="b";
arguments[2]="c";
为什么不添加
x = arguments[0];
y = arguments[1];
z = arguments[2];
? 我想有一些理由说明为什么这不符合你的目标,但我想我需要一个更现实的例子才能看到真正符合你目标的东西。
答案 2 :(得分:0)
也许你可以这样做:
var args = Array.prototype.slice.call(arguments);
然后与args
合作?你可以将args
传递给你需要的其他功能。如果这有助于你,或者我正在咆哮错误的树,请告诉我。