2016-05-21 2 views
3

Я хотел знать, где моя логика неисправна. Строка (str) берется как аргумент (строка может быть строчной, прописной, запятой и периодами) и устанавливается равной var string. Затем он отменяется, и если он равен исходной строке, возвращаемое значение равно true. Если он не равен, отображается возвращаемое значение false. Почему он оценивает все как истинные?Определение, является ли строка палиндром

function palindrome(str) { 
    var string =str.toLowerCase().replace(/\s/g, '').replace(/,/g , '').replace(/./g , ''); 

    if (string==string.split("").reverse().join("")) { 
     return true; 
    } 
    else{ 
     return false; 
    }  
} 

palindrome("nope"); 

ответ

9

Т.Л., д-р заменить . в последнем регулярном выражении с \. раздеть буквенные . с; прямо сейчас, вы снимаете все символов.

Проблема

В регулярных выражениях, . соответствует любому символу (за исключением новых линий, \n, по крайней мере, по умолчанию). Таким образом, этот код заменяет любой характер:

replace(/./g , '') 

В результате, вы опорожнение строки. Обратная пустая строка - это пустая строка, поэтому вы всегда получаете возвращаемое значение true.

Решение

Чтобы соответствовать буквальный период, вы должны избежать . написав \.. Таким образом, изменить эту часть

replace(/\./g , '') 

Некоторых Refactoring сделать свой код более устрашающим

Вы также можете просто вернуть результат вашего сравнения; нет необходимости в if/else блок здесь. Это сделало бы весь ваш код (отформатирован для удобства чтения):

function palindrome(str) { 
    var string =str.toLowerCase() 
        .replace(/\s/g, '') 
        .replace(/,/g , '') 
        .replace(/\./g , ''); 

    return string==string.split("").reverse().join(""); 
} 

palindrome("nope"); 

Вы можете пойти еще дальше и просто раздеться все не-буквенные символы, так что ваш код может быть еще проще:

function palindrome(str) { 
    var string =str.toLowerCase().replace(/[^a-z]/g, ''); 

    return string==string.split("").reverse().join(""); 
} 

palindrome("nope"); 
+0

Хорошо, что сделал гораздо больше смысла. Спасибо! – Codes316

+1

'string.split (" "). Reverse(). Join (" ");' знать, что этот трюк работает на английском и некоторых других языках, которые используют набор символов латинского алфавита, но могут терпеть неудачу на языках, которые используют символы, которые используют символ Unicode очков> 16 бит. –

Смежные вопросы