为什么我的 JS for 循环不起作用? (returns "undefinded"

Why is my JS for loop not working? (returns "undefinded"

我正在做一个 JS 练习,它要求我按相反的顺序 return 一个数字组合 (1234 => 4321) 所以我一如既往地尝试自己做而不寻找解决方案,我来了与:

function rev(n){
    for(i=n.length;i=0;i--){
       var reversed = reversed + n[i];
    }
    return reversed;
}
console.log(rev("test"));

但是当我在 VSCode 上 运行 时,它 return 对我来说是未定义的,我不明白我的代码的哪一部分是错误的。有什么想法吗?

您在 for 循环中定义 reversed。您需要做什么:

function rev(n) {
  let reversed = "";
  for (let i = n.length - 1; i >= 0; i--) {
    reversed = `${reversed}${n[i]}`;
  }
  return reversed;
}
console.log(rev("test"));

必须使用循环吗?

代码如下:

String(1234)  // make the number a string 
.split("")    // split on char making an array
.reverse()    // reverse that array
.join("")     // join it back

+ 将反转的字符串转换回数字

console.log(
 +String(1234).split("").reverse().join("")
)

您可以按照下面的代码片段修改现有代码,它会正常工作

function rev(str){
  var n = str.split("");
  var reversed ="";
    for(i=n.length-1; i >= 0 ; i--){
       reversed +=n[i];
    }
    return reversed;
}
console.log(rev("1234"));

保留字符串的最佳方式

const reverseStr = str => {
  var splitString = str.split("");
  var reverseArray = splitString.reverse();
  var joinArray = reverseArray.join(""); 
  return joinArray;

};

你可以这样做:

const reverseString = text => {
  let result = "";
  for (let i = text.length - 1; i > -1; i--) {
    result += text[i];
  }

  return result;
};

console.log(reverseString('test'));

好的,我明白你的意思了。您打算实现它并且想知道为什么 您的 代码没有按预期工作。感谢您勇敢的做法。让我们逐步解决您遇到的问题:

初始代码

function rev(n){
    for(i=n.length;i=0;i--){
       var reversed = reversed + n[i];
    }
    return reversed;
}
console.log(rev("test"));

在循环外定义反转

function rev(n){
    var reversed = "";
    for(i=n.length;i=0;i--){
        var reversed = reversed + n[i];
    }
    return reversed;
}
console.log(rev("test"));

说明:您的代码在每一步都在循环内重新创建它,并且假设它没有以某种方式在函数外部定义,它会在第一次使用时崩溃。在将任何内容连接到它之前,您需要正确初始化它。

修复串联

function rev(n){
    var reversed = "";
    for(i=n.length;i=0;i--){
        reversed = reversed + n[i];
    }
    return reversed;
}
console.log(rev("test"));

解释:删除了循环内的 var 关键字,因此您可以重复使用 reversed 并正确地将 n[i] 连接到它。

正确定义 i

function rev(n){
    var reversed = "";
    for(let i = n.length - 1;i=0;i--){
        reversed = reversed + n[i];
    }
    return reversed;
}
console.log(rev("test"));

说明:您需要确保 i 作为变量存在。另外,我们从 n.length - 1 初始化它,因为索引从 0 开始,所以第一个元素的索引为 0,第二个元素的索引为 1 并且...第 k 个元素的索引为k-1,因此 n 的最后一个元素是 n.length - 1 并且,正如您已经正确理解的那样,最后一个元素必须是第一个元素。

修复继续条件

function rev(n){
    var reversed = "";
    for(let i = n.length - 1;i>=0;i--){
        reversed = reversed + n[i];
    }
    return reversed;
}
console.log(rev("test"));

解释:你假设for里面的第二条语句是结束条件,但恰恰相反:它是继续条件。它将普通单词翻译为 "repeat as long as",而不是 "repeat until".

防御性地做

function rev(n){
    var reversed;
    if (typeof n === "string") {
        reversed = "";
        for(let i = n.length - 1;i>=0;i--){
            reversed = reversed + n[i];
        }
    }
    return reversed;
}
console.log(rev("test"));

说明:只有当它是一个字符串时,我们才会进行还原。

让我们支持数组:

function rev(n){
    var reversed;
    if (typeof n === "string") {
        reversed = "";
        for(let i = n.length - 1;i>=0;i--){
            reversed = reversed + n[i];
        }
    } else if (Array.isArray(n)) {
        reversed = [];
        for(let i = n.length - 1;i>=0;i--){
            reversed.push(n[i]);
        }
    }
    return reversed;
}
console.log(rev("test"));
console.log(rev(["t","e","s","t"]));

说明:数组的算法与字符串的算法相似,但我们仍然应对技术差异。