为什么未将空参数识别为未定义?

时间:2019-08-27 17:45:40

标签: javascript arguments parameter-passing

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

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参数的方式有关。

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

编辑挑战测试规范:

enter image description here

2 个答案:

答案 0 :(得分:3)

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())

答案 1 :(得分:1)

尝试一下。 :)

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];
      }
    }
  }
}