为什么我的 for 循环比预期的更早中断?

Why is my for loop breaking earlier than expected?

我正在尝试解决 leetCode 上的一个问题:

给定一个未排序的整数数组 nums,return 最小的缺失正整数。 这是我想出的代码

var firstMissingPositive = function(nums) {
    nums.sort();
    let x = 1;  //this is to compare the elements of nums
    for (let num in nums) {
      if (nums[num] <= 0) continue; //because anything less than 1 does not matter
      else if (nums[num] != x) break; //if x is not present, x is the answer
      else x++;                      // if x is present, x should increment and check for the next integer
    }
    return x;
};

此代码适用于 106/173 个测试用例。不通过下面的case,看起来很简单-

nums = [1,2,3,4,5,6,7,8,9,20];

我得到的输出是 3,而预期输出是 10。

我不是在寻找问题的正确解决方案。我只是好奇为什么这个看似简单的测试会失败。我不明白为什么我的循环在经过 1 和 2 时会在 3 处中断。请帮忙!

这是问题的根本原因 (mdn):

The sort() method sorts the elements of an array in place and returns the sorted array. The default sort order is ascending, built upon converting the elements into strings, then comparing their sequences of UTF-16 code units values.

所以排序后得到的是 [1, 2, 20, 3, ...],因为“20”字符串在“3”字符串之前。将其修复为 force sorting by numeric value:

的一种可能方法
nums.sort((a, b) => a - b);