JavaScript:有人可以告诉我我的代码出了什么问题吗?

时间:2015-03-11 17:04:34

标签: javascript

我一直在做JavaScript练习,因为我已经做了很长时间了。他们中的大多数都在工作,但我一直盯着这个。

我需要制作全部小写的上部和下部反之亦然。我检查了解决方案,这很有帮助,但我确信我可以获得自己的代码(这与答案非常不同)。

感谢您的帮助。

function swapCase (str) {
  var sen = str;
  for ( var i = 0; i < sen.length; i++) {
    if (sen.charAt(i) === sen.charAt(i).toLowerCase()) {
      sen.charAt(i).toUpperCase();
    } else if (sen.charAt(i) === sen.charAt(i).toUpperCase()) {
      sen.charAt(i).toLowerCase();
    }
  } return sen;
}

console.log(swapCase("UPlowUPlow"));

P.s:我知道它不是最干净的代码,但我已经有一段时间了。 :)

4 个答案:

答案 0 :(得分:4)

toUpperCasetoLowerCase 返回修改过的字符串,他们不会在适当的位置修改它。因此,您必须将该值放入您正在处理的字符串中,例如:

sen = sen.substring(0, i - 1) + sen.charAt(i).toUpperCase() + sen.substring(i + 1);

由于这相当尴尬,你可能最好将字符串转换为单字符字符串数组,处理数组,然后重新组合。

您可以将字符串转换为单字符字符串数组,如下所示:

theArray = theString.split("");

...然后处理每个条目,循环或通过Array#map

theArray[i] = theArray[i].toUpperCase();

...然后在完成时将其转换回来:

theString = theArray.join("");

以下是使用Array#map的示例:

&#13;
&#13;
function swapCase (str) {
  var theArray = str.split("");
  theArray = theArray.map(function(ch) {
    var lower = ch.toLowerCase();
    return ch === lower ? ch.toUpperCase() : lower;
  });
  return theArray.join("");
}
var str = "UPlowUPlow";
snippet.log("Before: " + str);
str = swapCase(str);
snippet.log("After: " + str);
&#13;
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
&#13;
&#13;

这里是简洁的版本:

&#13;
&#13;
function swapCase (str) {
  return str.split("").map(function(ch) {
    var lower = ch.toLowerCase();
    return ch === lower ? ch.toUpperCase() : lower;
  }).join("");
}
var str = "UPlowUPlow";
snippet.log("Before: " + str);
str = swapCase(str);
snippet.log("After: " + str);
&#13;
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

sen.charAt(i).toUpperCase()不会更改该位置的角色。您需要手动更新它。

function swapCase (str) {
  var sen = str;
  var updatedStr = "";
  for ( var i = 0; i < sen.length; i++) {
    if (sen.charAt(i) === sen.charAt(i).toLowerCase()) {
      updatedStr  += sen.charAt(i).toUpperCase();
    } else if (sen.charAt(i) === sen.charAt(i).toUpperCase()) {
      updatedStr  += sen.charAt(i).toLowerCase();
    }
  } 
  return updatedStr;
}

答案 2 :(得分:1)

作为旁注,请记住字符串是不可变的,quoting

  

在JavaScript中,字符串是不可变对象,这意味着   其中的字符可能无法更改,也不能进行任何操作   字符串实际上创建新字符串字符串由。分配   参考,而不是价值。通常,当分配对象时   引用,通过一个引用对对象进行的更改将是   通过对象的所有其他引用可见。因为字符串   但是,您可以对a进行多次引用   字符串对象并不担心字符串值会在没有的情况下发生变化   你知道吗

答案 3 :(得分:1)

感谢人们的出色答案!

感谢你们,我在很长一段时间内“解决”了这个问题。

我很乐意提出你的答案,而不是写一封感谢信,但我还没有被允许这样做。所以,我会这样做。