Javascript 无法进行参数杂耍,因为传递undefined时arguments.length也会增加

Javascript 无法进行参数杂耍,因为传递undefined时arguments.length也会增加,javascript,Javascript,我有一个具有以下特征的比例函数: 我的函数定义如下所示: function scale (x, y = x, cx = 0, cy = 0) 为了确保大小写比例xy,cx=0,cy=0有效,我需要进行参数杂耍。我以前是这样做的: if (arguments.length == 3) { // juggle } 但是,当从另一个仅中继其参数的函数使用此函数时,会出现问题: function scaleFoo(x, y, cx, cy) { return scale (x, y, c

我有一个具有以下特征的比例函数:

我的函数定义如下所示:

function scale (x, y = x, cx = 0, cy = 0)
为了确保大小写比例xy,cx=0,cy=0有效,我需要进行参数杂耍。我以前是这样做的:

if (arguments.length == 3) {
  // juggle
}
但是,当从另一个仅中继其参数的函数使用此函数时,会出现问题:

function scaleFoo(x, y, cx, cy) {
    return scale (x, y, cx, cy)
}
ScaleFo不关心其参数是否有效。它只是传递一切。 但在这种情况下,arguments.length始终为4。即使cy是未定义的


我知道我可以使用scale.call来解决这个问题,但我需要通过一个this,在这种情况下,我真的希望避免。我更喜欢使用更好的if分支的解决方案。

我想告诉您一些方法

function scaleFoo(x, y, cx, cy) {
  // Here arguments.length will be 3. and cy will be `undefined`
  // Therefore whenever you will call scale function it will four arguments
    return scale (x, y, cx, cy)
}
你可以这样做

function scaleFoo(x, y, cx, cy) {
    if (arguments.length === 3)
        return scale (x, y, cx)
    else
        return scale (x, y, cx, cy)
}
但是,如果您从代码中传递未定义的内容(如

scale(x, void 0, cx, cy)
// void 0 == undefined
在你的尺度函数中,条件应该是

function scale(x, y, cx, cy) {
    if (y === void 0) {}
}
当您按名称传递在这样的包装器函数中得到的参数时,如果使用三个参数调用其中一个包装器,您将传递未定义的参数。例如,scalefo1,2,3将导致它调用scale1,2,3,undefined

您也可以添加逻辑来检查包装器函数中的参数,但不能很好地缩放任何双关语。想象一下,原始函数最多需要处理五个参数。您将需要在包装器中再次包含参数计数逻辑

另一种方法是检查每个参数是否未定义,但这在很多时候也是不可行的,例如,如果这确实是一个有效值

相反,您可以简单地使用将整个arguments对象从包装器传递到原始函数:

功能刻度x,y=x,cx=0,cy=0{ console.log传递的参数数:,arguments.length; console.logx,x,y,y,cx,cx,cy,cy; } 函数scaleFox,y,cx,cy{ 返回scale.applythis,参数; } scalefo1; scalefo1,2; 标度fo1,2,3;
标度fo1,2,3,4;可以使用默认值和两个函数,也可以不使用默认值并检查第四个参数。不能将arguments.length==3替换为cy==undefined吗?如果您使用3个参数调用scale,cy将是未定义的,如果您使用设置为未定义的第四个参数调用scale,cy将是。。。undefined toono,因为当您只传递一个参数时,cy是undefined的,即使您不想,您也可以进行处理,因为y=y,cx变成y,又称为xyes。最好的代码设计是不允许输入3个参数。然而,这不是我决定的,而是用户。对于第一种方法:是的,这可能有效,但会产生很多额外的逻辑。。。我想我还是要用call吧……正如我在问题中所说的,我知道call。所以我现在也要申请。我要求另一个解决办法。但是我觉得诺丽会处理价差和收益率…参数;,但是你忽略了默认值。是的,我只是计算了相同的值。规模…争论才是出路。scalefo没有默认值,因此这很好。此外,apply也是如此。请随意回答@Fuzzyma嗯,我觉得你没有太多的选择。撒布是一种语法上的糖分。应用。我将把它添加到我的答案中,使其更加明确,但我不知道你还可以做什么——要么在包装器中重新实现参数检查逻辑,要么遍历每个参数,看看它是否未定义。两者都不能很好地扩展。我忘了添加,如果您不想传递它,那么您可以通过调用.applynull,arguments来忽略它。如果函数不使用这个,那么它就无关紧要了。如果是这样,那么您可能已经在做一些事情来获得正确的上下文,或者通过使用scale=scale.bindcorrectContext或arrow函数,或者以其他方式使其成为非因子,在这种情况下,您传入的值并不重要。
function scale(x, y, cx, cy) {
    if (y === void 0) {}
}
function scaleFoo(x, y, cx, cy) {
    return scale (x, y, cx, cy)
}