gpt4 book ai didi

javascript - 改变函数参数

转载 作者:行者123 更新时间:2023-11-30 05:52:04 24 4
gpt4 key购买 nike

想检查传递给函数的参数并替换未指定的参数或“我不喜欢”的参数。为此,我完成了以下操作(我想使用 arguments 的原因是我希望有一个通用函数来执行此操作)(与 node.js 的结果相同,只需将 Logger 更改为 console ):

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。相反,在最终实现中,我想将参数传递给一个对它们起作用的函数。

最佳答案

问题是,当调用 argtest() 时,arguments 实际上没有 "0" 属性来引用 x,或 "1" for 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,但受命名参数的数量和传递的参数数量的限制。

关于您的意图:

I want to throw in into an existing implementation at the beginning of functions a call to a function which simply takes the arguments and some defaults as parameter, e.g. defaults (arguments, "string=nana", "number=4")

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

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; }
}, ...);

// ...
}

关于javascript - 改变函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14128777/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com