Почему я получаю символы вместо символов при использовании String.fromCharCode?

Первый раз задавая вопрос - я нуб - я не смог найти решение этой конкретной проблемы.

Цель состоит в том, чтобы расшифровать шифр Цезаря. Мой код работает до такой степени, что в массив помещаются правильные буквенные коды. Я могу вручную превратить этот массив в правильную строку следующим образом:

String.fromCharCode(89, 79, 85, 32, 68, 73, 68, 32, 73, 84, 33);

Но когда я пытаюсь превратить массив в строку, вот так:

  return String.fromCharCode(arr.join(", "));

это возвращает \u0000 - который я собираю, является нулевым символом Unicode.

Кто-нибудь может объяснить, что происходит?

Вот мой полный код:

function rot13(str) {
  var arr = [];
  for (var i = 0; i < str.length; i++){
    if (str.charCodeAt(i) > 77 && str.charCodeAt(i) < 91){
      arr.push(str.charCodeAt(i) - 13);
    } else if (str.charCodeAt(i) <=77 && str.charCodeAt(i) > 64) {
      arr.push(str.charCodeAt(i) + 13);
    } else {
      arr.push(str.charCodeAt(i));
    }
  }
  console.log(arr);
  return String.fromCharCode(arr.join(", "));
}

rot13("LBH QVQ VG!");
String.fromCharCode(89, 79, 85, 32, 68, 73, 68, 32, 73, 84, 33);

1 ответ

Решение

arr.join(',') не будет расширяться до списка аргументов функции. Вам либо нужно использовать Function.apply (.apply(null, arr)) или если у вас есть ES6, используйте оператор распространения:

return String.fromCharCode(...arr);

или же

return String.fromCharCode.apply(null, arr);

function rot13(str) {
  var arr = [];
  for (var i = 0; i < str.length; i++){
    if (str.charCodeAt(i) > 77 && str.charCodeAt(i) < 91){
      arr.push(str.charCodeAt(i) - 13);
    } else if (str.charCodeAt(i) <=77 && str.charCodeAt(i) > 64) {
      arr.push(str.charCodeAt(i) + 13);
    } else {
      arr.push(str.charCodeAt(i));
    }
  }

  return String.fromCharCode.apply(null, arr);
}

console.log(rot13("LBH QVQ VG!"));

Другие вопросы по тегам