【问题标题】:Why Is Empty Argument Not Getting Identified as Undefined?为什么空参数没有被识别为未定义?
【发布时间】:2019-12-31 22:32:06
【问题描述】:

对于编码挑战,我有一个(几乎)可行的解决方案:

function addLetters(...letters) {
  let sum = 0;
  const alphabet = 'abcdefghijklmnopqrstuvwxyz'.split('');
  if (typeof letters === 'undefined' || letters === [] || letters === undefined) {
    return 'z';
  }
  for (let i = 0; i < letters.length; i++) {
    sum += (alphabet.indexOf(letters[i]) + 1);
  }
  if (sum <= 26) {
    return alphabet[sum - 1];
  } else {
    while (sum > 26) {
      sum = (sum - 26);
      if (sum <= 26) {
        return alphabet[sum - 1];
      }
    }
  }
}

console.log(addLetters())

但正如您所见,在 console.log(addLetters()) 这个特殊情况下,它返回的是 undefined 而不是 'z' - 这是为什么呢?

我认为这一定与...lettersrest / default / destructured / spread 参数的方式有关。

事实上,挑战确实希望参数显示为 spread,但我不知道如何适应它。

编辑挑战测试规范:

【问题讨论】:

  • letters 参数将永远=== [] — 它们是两个不同的数组。
  • 换句话说[] === []总是false
  • 有趣,所以关键是检查array.length === 0,正如 Code Maniac 指出的那样。
  • typeof letters === 'undefined'letters === undefined 不需要同时测试,它们的意思是一样的。
  • 而且我认为散布参数永远不会是未定义的,因此也没有必要进行测试。

标签: javascript arguments parameter-passing


【解决方案1】:
letters  === []

将始终为 false,因为它们是 两个不同的引用,它们永远不会评估为 true,您需要检查数组的长度检查它是否为空

您还可以安全地从 if 语句中删除其他两个条件,因为 letters 将始终是一个数组

function addLetters(...letters) {
  let sum = 0;
  const alphabet = 'abcdefghijklmnopqrstuvwxyz'.split('');
  if (letters.length === 0) {
    return 'z';
  }
  for (let i = 0; i < letters.length; i++) {
    sum += (alphabet.indexOf(letters[i]) + 1);
  }
  if (sum <= 26) {
    return alphabet[sum - 1];
  } else {
    while (sum > 26) {
      sum = (sum - 26);
      if (sum <= 26) {
        return alphabet[sum - 1];
      }
    }
  }
}

console.log(addLetters())

【讨论】:

    【解决方案2】:

    试试这个。 :)

    function addLetters(...letters) {
      let sum = 0;
      const alphabet = 'abcdefghijklmnopqrstuvwxyz'.split('');
      if (!letters.length) {
        return 'z';
      }
      for (let i = 0; i < letters.length; i++) {
        sum += (alphabet.indexOf(letters[i]) + 1);
      }
      if (sum <= 26) {
        return alphabet[sum - 1];
      } else {
        while (sum > 26) {
          sum = (sum - 26);
          if (sum <= 26) {
            return alphabet[sum - 1];
          }
        }
      }
    }
    
    

    【讨论】:

      猜你喜欢
      • 2021-02-22
      • 2023-03-25
      • 1970-01-01
      • 2020-11-03
      • 2020-03-30
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多