javascript array.length為零,但數組中有元素




arrays scope (2)

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秒鐘過去然後展開它,那麼你會看到它被填滿了。

注意: 此外,記錄到控制台的行(類似於 > Array(0) )只是日誌發生時對象/數組的字符串表示。 如果對象/數組發生更改,它將不會更新。 所以有時也可能會讓人 confusing 。

我希望現在很清楚。

這個問題在這裡已有答案:

我目前正在練習使用電子,但我對javascript很新,我遇到了一個讓我感到困惑的問題。 我有以下代碼:

    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 定義的 dirPath ,然後循環並獲取該目錄中所有文件的完整路徑。 它將它們附加到一個數組,然後在底部,它將數組記錄到控制台,然後是數組的長度。 令我感到困惑的是,給定該代碼,數組會按預期記錄到控制台,但隨後控制台將長度記錄為零。 我目前的想法是它與範圍有關,但這沒有意義,因為我正在聲明數組,在正在運行的函數之上的函數中的 filePaths 。 除非我錯過了什麼。 誰能指出我做錯了什麼?


只是為了擴展@ ibrahim-mahrir的答案,他們的意思就是這樣

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




electron