Mimo że newArray.join("") i x.toUpperCase() dają ten sam ciąg znaków 'MADAM', newArray.join("") === x.toUpperCase() nie zwraca prawdy.

Czy ktoś może mi pomóc zrozumieć, dlaczego tak jest.

Zastrzeżenie: funkcja nie jest przeznaczona dla słów składających się z jednej litery.

function isPalindrome(x) {
  a=x.toUpperCase().split("")
  if (a.length===1) {
    return a
  }else {
    newArray=[a.pop()]
    newArray=newArray.concat(isPalindrome(a.join("")))
  }
  return newArray.join("")
}

console.log('newArray.join(\'\'):', isPalindrome("Madam"));

function isPalindrome(x) {
  a=x.toUpperCase().split("")
  if (a.length===1) {
    return a
  }else {
    newArray=[a.pop()]
    newArray=newArray.concat(isPalindrome(a.join("")))
  }
  return x.toUpperCase()
}

console.log('x.toUpperCase():', isPalindrome("Madam"));

Jednak:

function isPalindrome(x) {
  a=x.toUpperCase().split("")
  if (a.length===1) {
    return a
  }else {
    newArray=[a.pop()]
    newArray=newArray.concat(isPalindrome(a.join("")))
  }
  return (newArray.join("") === x.toUpperCase())
}

console.log('===', isPalindrome("Madam"));

Przetestowałem już wyrażenie ścisłej równości i stwierdziłem, że działa w poniższym przykładzie.

x="madam"
a=x.toUpperCase().split("")

console.log(a.join("")===x.toUpperCase());//logs true
0
PhiAgent 20 listopad 2019, 04:40
Nie jest jasne, o co prosisz. Czy to Twój kod i chcesz, aby działał? A może pochodzi od kogoś innego i próbujesz to zrozumieć? A może to zrozumiałeś, widziałeś, że to jest okropne i chcesz wiedzieć, jak to zrobić właściwie?
 – 
Bergi
20 listopad 2019, 04:46
3
Funkcja isPalindrome (str) {return str.split (''). reverse (). join ('') === str; }
 – 
net.uk.sweet
20 listopad 2019, 04:47
2
Ta funkcja jest zbyt skomplikowana, niż mogłaby być ...
 – 
Hao Wu
20 listopad 2019, 04:47
1
"Funkcja nie jest przeznaczona do jednoliterowych słów" - to nie tylko potencjalna wada, to ostateczna wada.
 – 
Bergi
20 listopad 2019, 04:49
, to mój kod i staram się, aby działał.
 – 
PhiAgent
20 listopad 2019, 04:51

2 odpowiedzi

Najlepsza odpowiedź

Operator porównania nie jest wadliwy. To jest coś w twoim kodzie.

Spójrz na tę linię:

newArray = newArray.concat(isPalindrome(a.join("")));

Gdy funkcja zwraca ciąg w przypadku newArray.join('') lub x.toUpperCase(), zwracają te same wartości. Jak na razie dobrze.

Ale kiedy funkcja zwraca newArray.join('') === x.toUpperCase(), staje się wartością logiczną.

Oznacza to, że w podświetlonej linii powyżej nigdy nie wyświetli słowa 'MADAM'.

Zobacz poniższy przykład dla ilustracji. To Twoja funkcja, dodałem tylko console.log, aby poinformować Cię, jakie wartości są zwracane:

function isPalindrome(x) {
  a=x.toUpperCase().split("")
  if (a.length===1) {
    return a
  }else {
    newArray=[a.pop()]
    newArray=newArray.concat(isPalindrome(a.join("")))
  }
  
  console.log('Raw:', newArray);
  console.log('Joined:', newArray.join(''));
  console.log('Comparison:', newArray.join(''), '===', x.toUpperCase());
  
  return (newArray.join("") === x.toUpperCase())
}

isPalindrome('Madam')

Wniosek

Twoja obecna funkcja nie będzie działać. Musisz skorzystać z innego sposobu, aby wykonać to zadanie.

PS

Ponieważ pytasz o potencjalną wadę operatora porównania, odpowiadam tylko na to.

To nie jest wadliwe.

1
yqlim 20 listopad 2019, 05:18

Operator ścisłego porównania równości nie ma wady. Poniżej znajduje się lepsze i bardziej niezawodne rozwiązanie, które obsługuje również słowa składające się z pojedynczych liter.

function isPalindrome(string) {

  //first remove possibility of difference by different cases
  string=string.toUpperCase()

  //there are some exceptions that need to be taken care of
  //Exceptions
  //single letter words
  if (string.length===1) {
    return true
  }
  //two letter words
  if (string.length===2) {
    if (string[0]===string[1]) {
      return true
    }else{
      return false
    }
  }
  //after taking care of exceptions, you can use recursion to complete
  if (string.length>2) {
    if (string[0]!==string.slice(-1)) {
      return false
    }else{
      output=isPalindrome(string.slice(1,-1))
      return output
    }
  }
  return false
}

isPalindrome("maDAm")//evaluates to true
isPalindrome("a")//evaluates to true
isPalindrome("aba")//evaluates to true
isPalindrome("as")//evaluates to false
0
PhiAgent 20 listopad 2019, 19:28