For Loop Создает бесконечный цикл при обнаружении неалфавитного символа - PullRequest
0 голосов
/ 17 октября 2019

Во время итерации цикла я не увеличивается, если в операторе if обнаружен не алфавитный символ.

Нечисловая функция возвращает true, если символ не алфавитный, иначе возвращает false. Когда я тестировал код внутри цикла for, у меня была консоль, выводившая значение i. Всякий раз, когда код достигал не алфавитного символа, я не увеличивался и, таким образом, создавал бесконечный цикл for.

function isUpper(str){
  for(i = 0; i < str.length; i++){
    if(str.charAt(i) == str.charAt(i).toUpperCase()){
      if(!nonnumeric(str.charAt(i))){
        return true;
      };
    };
  };
  return false;
};

Я ожидаю, что он вернет true, если внутри строки есть заглавный символ. Если в строке нет символа верхнего регистра, я ожидаю, что он вернет false.

Ответы [ 2 ]

1 голос
/ 18 октября 2019

Если вы проверяете, является ли вся строка прописными, вы можете сделать что-то намного проще.

function isUpper(str) {
  return /^[A-Z\s\W]+$/.test(str);
}

console.log(isUpper('ALL UPPER CASE'));
console.log(isUpper('ALL UPPER CASE! WITH ~@# STUFF'));
console.log(isUpper('THIS hAS ONE LOWER CASE CHARACTER'));
console.log(isUpper('THIS HAS 1 NUMBER'));

Объяснение

Регулярное выражение проверяет, соответствует ли вся строка от начала (^) до конца ($) символам, заключенным в [], который находится в диапазоне от заглавной буквы A до заглавной Z (A-Z, специальный символ пробела \s и другие несловесные символы \W, соответствующие одному или нескольким разам. Можно выполнить точную настройкучтобы убедиться, что он соответствует хотя бы одной заглавной букве, за которой, возможно, следуют пробелы, запятые, восклицательные знаки и т. д. Все зависит от ваших вариантов использования и ожидаемого значения ввода-вывода

EDIT

Не прочитал последнее предложение под кодом. Если все, что вам нужно, это проверить заглавные буквы где-то в строке, вы можете просто набрать

function isUpper(str) {
  return /[A-Z]/.test(str)
}

console.log(isUpper('ALL UPPER CASE'));
console.log(isUpper('ALL UPPER CASE! WITH ~@# STUFF'));
console.log(isUpper('THIS hAS ONE LOWER CASE CHARACTER'));
console.log(isUpper('THIS HAS 1 NUMBER'));
console.log(isUpper('this has no uppercase characters at all'));
1 голос
/ 18 октября 2019

Пара вещей, которые, по моему мнению, вызывают проблему:

  1. Вы просматриваете каждый символ в строке отдельно, а затем возвращаете либо true, либо false. Если ваша цель состоит в том, чтобы определить, содержит ли строка хотя бы одну заглавную букву, сначала вам нужно выполнить итерацию всей строки. Прямо сейчас, если ваш первый символ не в верхнем регистре, он не вернет true и поэтому мгновенно вернет false.
  2. Когда вы перебираете строку, вы нажимаете не-альфа-символы, такие как пробелы и знаки препинания. Если вы проверите, равен ли период «нижнего регистра» периоду «верхнего регистра», он оценивается как true, что может привести к ложному срабатыванию.

Решение: Я немного изменил функцию. Теперь он перебирает всю строку и использует регулярное выражение («регулярное выражение»), чтобы определить, является ли проверяемое значение действительно буквой. Если в нем встречается заглавная буква, счетчик увеличивается, что позволяет коду проходить всю строку. Мы используем логический оператор «&&» для выполнения двух логических проверок внутри нашей конечной функции if.

Как улучшить: Вы могли бы улучшить этот код, вернув true, как только счет увеличится выше 0, ноЯ оставлю это на ваше усмотрение, если хотите.

РЕДАКТИРОВАТЬ: переместил 2-й оператор If в цикл for, чтобы, как только условие было выполнено, оно возвращало true, вместо того, чтобы проходить весь циклстрока перед проверкой.

function isUpper(str) {
  let count = 0;

  for (let i = 0; i < str.length; i++) {
    if (/[a-zA-Z]/.test(str.charAt(i)) && str.charAt(i) == str.charAt(i).toUpperCase()) {
      count += 1;
    }

    if (count > 0) {
      return true;
    }
  }

  return false;

}

Дайте мне знать, если это поможет!

...