【问题标题】:Simple js FOR loop returning 'undefined'简单的 js FOR 循环返回“未定义”
【发布时间】:2015-04-24 06:25:24
【问题描述】:

不知道我在这里做错了什么;变量newStr 应该只返回“Hello World”,但我得到的是这个:

"undefinedHello World"
undefined

JS

function translate2(x){
  var newStr;
  x = "Hello World";
  for(i=0; i<x.length; i++) {
    newStr+=x.charAt(i);
  }
  console.log(newStr);
}

【问题讨论】:

  • var newStr = ''; undefined + 'qwe' === 'undefinedqwe'

标签: javascript variables for-loop


【解决方案1】:

以上答案不正确。 console.log() 将在循环完成之前运行,这就是你得到undefiend 的原因。 你可以找到你的答案here

你必须像这段代码一样思考同步:

function delay() {
  return new Promise(resolve => setTimeout(resolve, 300));
}

async function delayedLog(item) {
  // notice that we can await a function
  // that returns a promise
  await delay();
  console.log(item);
}
async function processArray(array) {
  for (const item of array) {
    await delayedLog(item);
  }
  console.log('Done!');
}
processArray([1, 2, 3]);

这将为您提供1,2,3,done,这意味着 console.log 正在循环结束时发生!

【讨论】:

    【解决方案2】:
    1. 在 JavaScript 中,如果一个变量没有显式初始化,默认情况下它会有undefined。那不是字符串,而是语言的原始类型。您可以通过打印来检查它

      var newStr;
      console.log(newStr);
      // undefined
      console.log(newStr + "thefourtheye");
      // undefinedthefourtheye
      

      所以,只需用一个空字符串初始化变量,就像这样

      var newStr = '';
      
    2. 另外,请注意,在这一行

      for(i=0; i < x.length; i++) {
      

      i 以前从未被声明过。因此,将创建一个新的全局变量i。你可能不想要那个。所以,只需使用var 关键字来声明作用域为当前函数的变量,就像这样

      for (var i = 0; i < x.length; i++) {
      
    3. 除此之外,translate2 是一个函数,当它被调用时,人们会期望它返回一些东西。但是您没有明确返回任何内容。因此,JavaScript 默认返回 undefined。这就是为什么您在问题中获得第二个undefined。要解决这个问题,请使用 return 这样的语句

      function translate2(x) {
          var newStr = "";
          for (var i = 0; i < x.length; i++) {
              newStr += x.charAt(i);
          }
          return newStr;
      }
      

    【讨论】:

    • 太好了,成功了。但是,在返回字符串后,控制台中仍会保留一个额外的未定义。为什么会发生这种情况?
    • @UncleSlug 您是否尝试了我回答中的第三个建议?
    • 是的,我使用了第三条建议。
    • @UncleSlug 在控制台中,不要使用console.log(translate2(..)),直接尝试translate2(..)console.log 函数调用不返回任何内容,因此默认情况下将返回 undefined。这就是为什么您会在控制台中获得额外的 undefined
    • 在控制台中,我一直在使用函数translate2()
    【解决方案3】:

    newStr 未定义。 添加

    var newStr = '';
    

    这样你就有了

    function translate2(x){
        var newStr='';
        x = "Hello World";
        for(i=0; i<x.length; i++) {
            newStr+=x.charAt(i);
        }
        console.log(newStr);
    }
    

    【讨论】:

      【解决方案4】:

      你应该首先初始化变量newStr。

      var newStr = '';
      

      否则,newStr 将是 undefined 和 undefined + "asa" = "undefinedasa" 在 javascript 中。如果您不知道未定义的内容,请查看this

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-19
        • 2020-07-08
        • 2022-11-16
        • 1970-01-01
        • 2021-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多