是否可以使用隐藏/额外的参数初始化变量

Is it possible to initialize a variable with a hidden/extra argument?

本文关键字:参数 初始化 变量 可以使 隐藏 是否      更新时间:2023-09-26

记住,我只编写了两周的代码,我找不到任何关于如何在递归函数调用中使用隐藏/额外参数初始化变量的信息。有可能吗?而且,如果可能的话,是否存在这样做是最佳实践的情况?


这个问题是在我对CoderByte挑战10(字母汤——取一个字符串,然后返回一个按字母顺序相同长度的字符串)的一个超级不雅的答案时出现的。[注意:是的,我知道我的答案是愚蠢的,有更好的方法来解决问题。我不需要帮助解决这个问题。我只将此代码作为我问题的上下文。]

从本质上讲,我想问是否有一种方法可以删除newStr作为参数(因为Java Script函数可以接受额外的参数),并仍然通过递归增长的答案字符串?如果我只是简单地删除newStr作为参数,那么newStr将不再初始化。但是,如果我在函数体中初始化newString(var newStr="),我就无法继续递归地传递排序后的字符串。如果有一种方法可以做到这一点,那么在用例中这种方法是否有意义?或者,这只是一个标志,上面写着,"换一种方式做。"

完整代码:

function AlphabetSoup(str, newStr) { 
  var alphabet = "abcdefghijklmnopqrstuvwxyz";
  var testVal= 0;
  //I'M ATTEMPTING TO PASS THROUGH AN ANSWER STRING THAT IS GROWING RECURSIVELY
  if (newStr == null)
    var newStr = "";
  if (str.length == 0)
    return newStr;
  for (var i = 1; i < str.length; i++) {
    if (alphabet.indexOf(str[0]) <= alphabet.indexOf(str[i])) {
      testVal += 1;
    }
  }
  // When the first letter, str[0], is ealier in the alphabet than every other letter
  if (testVal == (str.length - 1)) {
    //add the first letter to the newStr
    newStr = newStr + str[0];
    //remove the first letter from the input string
    str = str.substr(1);
    //recursively call AlphabetSoup to continue building newStr
    return AlphabetSoup(str, newStr);
  }
  //When the first letter isn't the earliest in the alphabet
  else {
    //put in in the back of str
    str = str.substr(1) + str[0];
    //until we find the next letter earliest in the alphabet
    return AlphabetSoup(str, newStr);
  }
}
console.log(AlphabetSoup("hooplah"));

当然,您可以检查arguments.length并用arguments[1]初始化变量,如果这是您所指的"JavaScript函数可以接受额外的参数",但这相当粗糙。在那里争论没有错。如果不想将其公开给调用方,请将递归函数封装在另一个只有单个参数的函数中。

在开始时检查newStr的想法是JS中的一种常见模式。但不要检查是null,而是undefined:

if (typeof newStr == "undefined") {
    var newStr = "";
}

如果您编写ES6(或Coffeescription),您可以为参数设置默认值:

function AlphabetSoup(str, newStr = '') {
    // ...
}