为什么这个回文结果总是不是回文?

时间:2016-06-06 01:45:20

标签: javascript palindrome

每次运行此代码时,即使输入是回文,也会导致“不是回文”。为什么会发生这种情况,如何让它显示正确的结果?

function palindrome(){
var input = document.getElementById("userInput").value;

var letterArray =[];
for(var i=0; i < input.length; i++){

	letterArray.push(input[i]);
}


var backwardsArray =[];

for(var i = input.length-1; i >= 0; i--){
	backwardsArray.push(input[i]);

}
if(letterArray === backwardsArray){
	console.log(input + " is a palidrome");
}else{
	console.log(input + " is not a palidrome");
}


console.log(letterArray);
console.log(backwardsArray);
}
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	
	<input id="userInput"/>
	<button id="submit" onClick="palindrome()">submit</button>
	<div id="input"></div>
	<script src="main.js"></script>
</body>
</html>

2 个答案:

答案 0 :(得分:1)

只有当两个值实际上是相同的时,严格相等运算符(===)才会返回true。 I would recommend reading this post to better understand how works == and ===。 简而言之,在不同时间单独创建的两个不同的数组将始终是两个不同的数组(即使它们包含相同的值)。

&#13;
&#13;
var a = [];
var b = [];
var c = a;
console.log(a === b); // False.
console.log(a === c); // True.
&#13;
&#13;
&#13;

您需要检查第一个数组中的每个值是否与第二个数组中的值相对应。 这是一种方法:

function compareArray(array1, array2){
  return (array1.length === array2.length) && array1.every(function(element, index) {
    return element === array2[index]; 
  });
}

&#13;
&#13;
function compareArray(array1, array2){
  return (array1.length === array2.length) && array1.every(function(element, index) {
    return element === array2[index]; 
  });
}

console.log(compareArray([1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6])); // True.
console.log(compareArray([1, 2, 3, 4, 5, 6], [1, 2, 3])); // False.
&#13;
&#13;
&#13;

据说有更短更有效的方法来检查回文。您不需要创建单个阵列:

function isPalindrome(str){
  var n = str.length;
  // You only need to iter on half of the string.
  for(var i = 0; i < n / 2; i++){
    if(str[i] !== str[n - i - 1]){
      return false;
    }
  }
  return true;
}

&#13;
&#13;
function isPalindrome(str){
  var n = str.length;
  for(var i = 0; i < n / 2; i++){
    if(str[i] !== str[n - i - 1]){
      return false;
    }
  }
  return true;
}

function palindrome(){
  var input = document.getElementById("userInput").value;
  if(isPalindrome(input)){
    console.log(input + " is a palidrome");
  }else{
    console.log(input + " is not a palidrome");
  }
}
&#13;
<input id="userInput"/>
<button id="submit" onClick="palindrome()">submit</button>
<div id="input"></div>
&#13;
&#13;
&#13;

答案 1 :(得分:-1)

因为这不是你如何检查数组是否相等。试试这个条件:

if(letterArray.toString() == backwardsArray.toString()) {
//is palindrome
}
else{
//not palindrome
}

<强> 修改

正如@Alexander O'Mara在评论中所提到的那样,为了避免误报你甚至可以这样做:

if(letterArray.join('') == backwardsArray.join('')) {
    //is a palin
}
else {
 //not a palin
}

注意 这不会进行类型检查。如果你想进行类型检查,请参阅@Anirudh Ramanathan评论