【问题标题】:What is the significance of using: string.split("").reverse().join(")?使用:string.split("").reverse().join(")有什么意义?
【发布时间】:2017-07-30 15:36:28
【问题描述】:

我想先说。非常初学者。善待。然而。我正在尝试反转字符串。将字符串作为参数放入函数中并反转其顺序。例如 'hello' 应该返回 'olleh' 等。

我已经完成了这个:

function revString(stringArg) {
    return stringArg.split("").reverse().join(");
}

但是。通过这样做:

function revString (stringArg) {
    stringArg.split("");
    stringArg.reverse();
    stringArg.join("");
    return stringArg;
}

第二个函数的结果输出是 reverse() 不是函数。谁能告诉我这里有什么区别?

【问题讨论】:

  • .split() 返回一个数组。在您的第二个 sn-p 中,您忽略了函数的返回值。
  • 可以通过以下方式解决这个问题:someVar = stringArg.reverse();

标签: javascript reverse


【解决方案1】:

这是因为split() 没有将字符串原地分割,而是将分割后的字符串作为新值返回。在您的第二个函数中,您执行stringArg.split(),但由于该操作没有发生,stringArg 永远不会发生变异。它始终保留完全相同的值和类型,这会导致您看到的错误。

第一个函数起作用的原因是因为函数调用应用于前一个调用的返回值。换句话说:

  • split()stringArg 上被调用
  • reverse() 是在split()返回值上调用的,这是一个数组,因此可以直接反转
  • reverse()返回值 上调用join()

但在第二个函数中,您在完全相同的变量stringArg 上调用它们,该变量始终保持不变。为了使您的功能正常工作,您需要像这样修改它:

function revString (stringArg) {
    a = stringArg.split(""); // Array
    b = a.reverse(); // Reversed array
    c = b.join(""); // String
    return c;
}

然而,这虽然可能更容易理解,但却是不必要的冗长。我建议坚持原来的功能。

【讨论】:

    【解决方案2】:

    这是因为.reverse() 用于.split("") 的输出。

    单独使用.reverse() 不起作用,因为它之前的行不会直接更改它,除非您使用stringArg = stringArg.split(""); 重新分配它。第一行将返回字符数组,但不会直接更改stringArg

    所以:

    stringArg.split("").reverse().join("");
    

    表示join 数组中的所有元素,其元素基于字符串的split 顺序排列在reverse 中。换句话说,.reverse() 用于stringArg.split(""),而不仅仅是stringArg,与.join("") 相同:它应用于stringArg.split("").reverse() 而不仅仅是stringArg

    因此解决方案是:

    function revString2 (stringArg) {
        a = stringArg.split("");
        b = a.reverse();
        c = b.join("");
        return c;
    }
    

    【讨论】:

      【解决方案3】:

      第一个示例链接上一个方法调用的结果,其中.split() 返回一个数组作为链中的第一个链接。

      第二个示例在每一行对原始字符串执行单独的任务,而不是链接到返回数组的第一行。

      .reverse()不是String.prototype定义的方法,导致第二行函数调用stringArg.reverse()报错。

      【讨论】:

        【解决方案4】:

        String#split 函数不起作用原位(不会改变原始字符串)。这就是为什么你不能使用只能在数组上调用的Array#reverse 函数。您可以尝试将接收到的新数组分配给一个新变量,然后使用Array#reverse,它原位工作(改变原始数组),然后返回加入数组。

        function revString(stringArg) {
            let arr = stringArg.split("");
            arr.reverse();
            return arr.join("");
        }
        
        console.log(revString('hello'));

        【讨论】:

          【解决方案5】:

          String.split() 返回一个新值,它是 str 中所有字符的数组 Array.reverse 返回一个内容反转的数组 连接返回一个字符串 这些函数不会改变它们的值,但我不确定。 下面的 stringArgs 变量设置为每个函数的返回值 试试:

          function revString ( stringArg ) { 
          stringArg=stringArg . split ( "" ); 
          stringArg=stringArg . reverse (); 
          
          stringArg=stringArg . join ( "" ); return stringArg ; } 
          

          【讨论】:

            猜你喜欢
            • 2014-10-02
            • 2017-11-21
            • 2016-01-12
            • 1970-01-01
            • 2022-01-23
            • 2011-04-26
            • 2010-10-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多