当前位置: 首页 > 知识库问答 >
问题:

array.Length为零,但数组中有元素[重复]

郁灿
2023-03-14
    function getPaths() {
      var dirPath = document.getElementById("mdir").innerHTML;
      var filePaths = [];
      fs.readdir(dirPath, function(err, dir) {
        for(var i = 0, l = dir.length; i < l; i++) {
          var filePath = dir[i];
          filePaths.push(dirPath + "/" + filePath);
        }
      });
      console.log(filePaths);
      console.log(filePaths.length);
    }

它应该查看由dirpath定义的目录,然后循环并获得该目录中所有文件的完整路径。它将它们追加到一个数组,然后在底部将数组记录到控制台,后面跟着数组的长度。令我困惑的是,给定代码,数组会像预期的那样记录到控制台,但控制台会记录零作为长度。我目前的想法是,它与作用域有关,但这没有意义,因为我在运行的函数上面声明了数组filepaths。除非我错过了什么。有人能指出我做错了什么吗?

共有1个答案

韶亮
2023-03-14

readdir是异步的。它不会马上得到结果。您应该在回调中使用filepaths。控制台显示该值的唯一原因是因为控制台在展开数组时对其进行计算。

当您按下左边的小箭头时,将鼠标放在右边的i框上。发生的情况是,控制台保留了对数组的引用,因此当用户展开数组时,它会显示数组的当前值。但是当您记录filepaths.length时,数组是空的,因为readdir还没有完成读取,这就是为什么您得到0。但是当您打开控制台并按下该箭头时,readdir将已经完成读取,控制台将打印数组的当前值(在数组填充之后)。

演示问题的例子:(不是解决方案,只是为了了解真正发生了什么)

var arr = [];

setTimeout(function() {
  arr.push(1, 2, 3);
}, 5000);

console.log(arr.length);

console.log(arr);

在这里,数组和它的长度在数组填充之前都被记录下来。数组将在5秒后填充。因此,输出将是0和数组array[]的字符串表示形式。现在,因为数组可能有大量的数据,所以控制台在用户展开数组之前不会显示这些数据。因此,控制台所做的是保留对数组的引用,直到用户按下展开箭头。如果您在5秒前展开数组,您将看到数组是空的(尚未填充)。如果您等到5秒后再展开它,那么您将看到它被填充,尽管它被记录为空数组。

注意:此外,记录到控制台的行(类似于>数组(0))只是记录发生时对象/数组的字符串表示。如果对象/数组更改,则不会更新。所以有时这也可能会让人困惑。

我希望现在清楚了。

 类似资料:
  • 我必须编写一个名为productOfPrevious的方法,它接受一个整数数组,并返回一个与输入大小相同的整数数组。返回数组中的每个单元格都是该单元格与前面所有单元格的乘积。 这是我的密码。但我不知道为什么输出数组中的元素总是为零。 输入:{1,2,3,4,5} 我需要的输出:{1,2,6,24,120} 我获得的输出:{0,0,0,0,0} 我的代码有什么问题吗?

  • 我在中用C创建了一个包含10个元素的数组,并仅为其中一些元素声明了值。当打印出数组时,我注意到其中一个元素(保持不变)没有初始化为零。相反,每次都将其初始化为不同的大值(即)。然后,我注释掉了所有代码,只保留了最初声明的数组。 运行代码时,数组的前8个元素被初始化为零,数组中的第9个元素被初始化为一个大值(如),该值每次都会更改,最后一个元素被一致地初始化为相同的非零数字。 有人知道为什么会这样吗

  • 如何在Java中复制数组的元素,并按原始数组的相同顺序将它们添加到新数组中 请解释为什么上面的代码不起作用。 我的输出是 : // [4, 4, 代替:

  • 我有一个Pandas数据框架,看起来像这样(有两行的示例): 我需要将所有内容解构为单个标量列,如下所示: 我不太关心新的列名;重要的是将行排列成如上所示的平面向量。 我如何才能做到这一点?

  • 我有一个从列表转换的数组,当我试图得到它的形状时,我只得到一个数字。这样地: 而我得到了 然后我试着 我明白了 好像a1的工作原理和a2一样。我能那样想吗?如果我把a1当成a2,除了形状法,会不会有问题?

  • 问题内容: 在我以前做 …将我所有的数组元素初始化为0。 Java中是否有类似的快捷方式? 我想避免使用循环,可以吗? 问题答案: 语言规范保证整数类型数组的默认值为0 : 每个类变量,实例变量或数组组件在创建时都会用 默认值 初始化(第15.9节,第15.10节)。[…]对于type ,默认值为零,即。 如果要将一维数组初始化为其他值,则可以使用java.util.Arrays.fill()(当