由于split属性中的引号而出现NaN

时间:2017-12-28 21:24:23

标签: javascript split

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

这是我制作的代码

$username = 'Administrator'
$password = ConvertTo-SecureString 'password' -AsPlainText -Force
$cred = New-Object Management.Automation.PSCredential ($username, $password)

Invoke-Command -Computer $server -ScriptBlock {
    Param($msg)
    Set-Content -Path C:\blah\foo.html -Value $msg
} -ArgumentList $statusMessage -Credential $cred

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

感谢您的时间。

5 个答案:

答案 0 :(得分:2)

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

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

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

循环应该在i < str.length时重复,而不是i <= 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"));

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您需要切换for循环并将strC定义为空白。由于strC未定义,因此第一次运行d_end = [] for c in df.columns: temp_df = pd.DataFrame(df[c].value_counts().rename('n')) temp_df['proportion'] = temp_df['n'] / temp_df['n'].sum() temp_df['variable'] = c temp_df.set_index(['variable',temp_df.index],inplace=True) d_end.append(temp_df) df_end = pd.concat(d_end,axis=0) 会导致NaN问题。此外,从str.length开始并减少到0似乎更容易。最后,如前所述,不需要分割调用。

strC = strC + strS[i];

答案 3 :(得分:0)

&#13;
&#13;
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");
&#13;
&#13;
&#13;

答案 4 :(得分:0)

您的代码中有两个简单的错误,它们会引导您到字符串开头的"NaN"

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

2)第二个错误是你用来索引值strL的变量,从输入字符串的长度开始,当它应该少一个。这是因为数组是零索引的,因此数组中的最后一项是strS[strS.length - 1]。 (代码中的strS.lengthstr.length相同)

例如:字符串"abc"的长度为3,因此strS等于["a", "b", "c"](长度为3)因此strS[0]等于"a"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现在指向数组中的最后一项,因此您获得了{{ 1 {}从"d"结束。因此,您的语句转换为"Hello, world"strC = NaN + "d";转换为字符串,因为NaN被视为字符串连接运算符,您最终得到+,然后其余的你的循环运行得很好。

有一些更好的方法可以完成你想要完成的任务,但是当你学习和练习更多时,你会把它们弄清楚,现在你知道你的代码为什么会这样做以及这个奇怪的地方{{1}废话来自。 :)

此外,我认为你似乎很困惑为什么你的输入有引号而不是输出。您输入的内容为"NaNd"的字符串,但字符串在引号ala "NaN"包围的代码中表示,因此您不应在输出中获得引号。

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

Hello, world

但是有一些更简单的方法,比如使用循环计数器本身从输入长度开始倒计时:

"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;
}