【问题标题】:NaN appearing because of quotes within split property由于拆分属性中的引号而出现 NaN
【发布时间】:2017-12-28 21:24:22
【问题描述】:

如果这里已经回答了这个问题,我很抱歉,但我不完全确定要寻找什么。我最近开始学习编码,因为我觉得这很有趣。我使用了一个网站,它告诉我我已经了解了有关 javascript 的所有知识(尽管我认为这不是真的)。为了得到一些练习和更好的处理,我决定做一些挑战。我正在研究一个并且大部分都是正确的。它说要反转任何输入字符串(我不需要编写如何输入的代码,至少我认为)。输入是str。我已经让它反转所有字符,包括标点符号,除了引号。要输入,该短语必须在引号中。在我的结果中,它没有引号,而是在短语前有一个 NaN。

这是我制作的代码

function FirstReverse(str) { 
    
    var strL = str.length;
    
    var strS = str.split("");
    
    for(var i = 0; i <= str.length; i++){
     
     var strC = strC + strS[strL];
     
     strL = strL -1;
        
    }
  // code goes here  
  return strC; 
         
}
   
// keep this function call here 
FirstReverse(readline());                            

如果我输入“Hello, world”,我会得到 NaNdlrow ,olleH。我是新来的,所以如果可以用更简单的术语来表达会有所帮助。你在代码中看到的是我所知道的最先进的东西。

感谢您的宝贵时间。

【问题讨论】:

  • 我刚拿到 NaNdlrow ,olle
  • strS[strL] 将在第一次循环中未定义。最高索引为strS[strL-1]
  • 如果你不知道数组上有一个反向函数,因为你已经把你的字符串变成了一个数组return str.split("").reverse().join("")
  • 也没有必要使用str.split()。您可以使用str[strL] 访问字符串中的字符。
  • 不,我不知道!这摆脱了 NaN,但没有引号(挑战希望“Hello”成为“olleH”),但谢谢你,虽然我仍然想知道我所拥有的有什么问题。

标签: javascript split


【解决方案1】:

您获得NaN 的原因是因为您从未初始化strC,而且您还在strS 数组之外进行访问。

您应该将strC 初始化为一个空字符串。

为了防止访问数组外,将strL初始化为str.length-1,因为数组索引从0变为length-1

i &lt; str.length,而不是i &lt;= str.length时,循环应该重复,否则你也会越过开头。

function FirstReverse(str) { 
    
    var strL = str.length-1;
    var strS = str.split("");
    var strC = "";
    
    for(var i = 0; i < str.length; i++){
     strC = strC + strS[strL];
     strL--;
        
    }
  // code goes here  
  return strC; 
         
}
   
// keep this function call here 
console.log(FirstReverse("abcdef"));

【讨论】:

  • 另一种选择是让循环从 length-1 开始并下降到 0 并使用 i 作为数组索引,而不是可以删除的 strL。类似for(var i = str.length - 1; i &gt;= 0; i--) { strC = strC + strS[i]; }
  • @csmckelvey 是的,有无数种不同的编码方式,比如strS[strS.length - 1 - i],或for (strL = strS.length-1; strL &gt;= 0; strL--)
  • 我决定保持结构尽可能接近他的原始代码,只是修复错误。
  • 同意并赞成,只是希望 OP 意识到除了他最初的方法之外还有其他方法。
  • 非常感谢。这有帮助。要添加引号,在返回中我放了 return '"' + strC + '"'; .这很有效!
【解决方案2】:

您需要切换 for 循环并将 strC 定义为空白。由于 strC 在您第一次运行 strC = strC + strS[i]; 时未定义导致 NaN 问题。此外,从 str.length 开始并递减到 0 似乎更容易。最后,正如之前发布的那样,不需要调用 split。

    function FirstReverse(str) { 

    var strL = str.length-1;

    var strC = "";

      for(var i = strL; i >= 0; i--){
       strC = strC + str[i];        
      }
    // code goes here
    return strC;            
    }

【讨论】:

    【解决方案3】:

    function FirstReverse(str) 
    { 
       var strC = "";
       var strS = str.split("");
        
       for(var i = str.length-1; i >= 0 ; i--) {  
           strC += strS[i];
       }
    
       return strC;       
    }
       
    FirstReverse("hello, world");

    【讨论】:

      【解决方案4】:

      您的代码中有两个简单的错误导致您在字符串的开头看到 "NaN"

      1) 您需要在循环外声明您的strC 变量,使其具有空字符串var strC = ""; 的初始值。目前第一次通过你的循环是undefined

      2) 第二个错误是您用于索引值的变量strL 以输入字符串的长度开始,而实际上它应该少一。这是因为数组是零索引的,所以数组中的最后一项位于strS[strS.length - 1]。 (你代码中的strS.lengthstr.length是一样的)

      例如:字符串"abc" 的长度为3,因此strS 将等于["a", "b", "c"](长度也为3),因此strS[0] 等于@987654335 @ 和 strS[2] 等于 "c"。但是由于您是从长度本身而不是length - 1 开始的,因此在循环的第一次迭代中您要求strS[3]undefined

      所以对于这个问题,在初始化变量时将长度减一:var strL = str.length - 1;

      导致出现字母"NaN" 的原因是因为在JavaScript 中NaN 是一个表示“不是数字”的特殊值,并且在转换为字符串时表示为"NaN"

      在您的第一个循环中,strCundefined(第一个问题),strS[strL]undefined(第二个问题),因此您的语句转换为 var strC = undefined + undefined;。在 JavaScript 中,undefined + undefined 被视为数学表达式,结果为 NaN

      所以在第二次循环开始时,strC 等于 NaN 并且 strL 现在指向数组中的最后一项,所以你从 @ 的末尾得到 "d" 987654356@。所以你的语句转换为strC = NaN + "d";NaN 被转换为字符串,因为+ 被视为字符串连接运算符,你最终得到"NaNd",然后你的循环的其余部分运行得很好。

      有一些更好的方法可以做你想要完成的事情,但是随着你学习和练习的更多,你会弄明白它们,现在你知道为什么你的代码会这样做,以及这个奇怪的"NaN"废话来自。 :)


      另外,我认为您似乎对为什么您的输入有引号但没有输出感到困惑。您正在输入内容为 Hello, world 的字符串,但字符串用引号括起来的代码表示 ala "Hello, world" 因此您不应在输出中得到引号。

      哦,为了清楚起见,您更正的代码如下所示:

      function FirstReverse(str) {
          var strL = str.length - 1;
          var strS = str.split("");
          var strC = "";
          for (var i = 0; i <= str.length; i++) {
              strC = strC + strS[strL];
              strL = strL - 1;
          }
          return strC;
      }

      但还有更简单的方法,例如使用循环计数器本身从输入长度倒数:

      function FirstReverse(str) {
          var strS = str.split("");
          var strC = "";
          for (var i = str.length - 1; i >= 0; i--) {
              strC = strC + strS[i];
          }
          return strC;
      }

      甚至无需拆分即可访问字符串本身:

      function FirstReverse(str) {
          var strC = "";
          for (var i = str.length - 1; i >= 0; i--) {
              strC = strC + str[i];
          }
          return strC;
      }

      或者甚至只是使用一些内置的字符串和数组函数:

      function FirstReverse(str) {
          return str.split("").reverse().join("");
      }

      【讨论】:

        【解决方案5】:

        我想我设法找到了错误。将 for 循环从 for(var i = 0; i &lt;= str.length; i++)for(var i = 0; i &lt; str.length; i++)。让我知道更改完成后发生了什么!

        【讨论】:

        • 当我这样做时,我输入了“它有效吗?”并得到了 NaN?krow ti di 而不是 "?krow ti diD"
        • "让我知道发生了什么" 您应该自己测试此代码,然后再将其发布为答案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        • 2021-06-05
        • 2021-10-04
        相关资源
        最近更新 更多