合并两个排序数组(leetcode 88):我不明白它怎么不会越界

Merge two sorted arrays (leetcode 88): i cant understand how it wont go out of bounds

我使用两个指针遇到的解决方案:

var merge = function (nums1, m, nums2, n) {
    let idx1 = m - 1,
        idx2 = n - 1,
        idx3 = m + n - 1;
    while (idx2 >= 0) {
        nums1[idx3--] = nums1[idx1] > nums2[idx2] ? nums1[idx1--] : nums2[idx2--];
    }
};

该解决方案有效,但我无法理解,

考虑 nums1 = [7,9,11,0,0,0,0], nums2 = [1,2,12,14],

在算法中的某个点,nums1 的索引为 7,nums2 为 2,

下一次迭代会导致idx1也为-1,那以后的比较语句会怎样?

(我希望我能把问题说清楚,如果我需要用更好的语言表达请告诉我)

此代码可以在 2 个地方越界,但它工作正常,因为 Javascript 在涉及越界数组访问时有点奇怪:

  1. 它可以在 nums1 结束后写入新元素。 Javascript 将自动加长数组以容纳新值。
  2. 可以比较nums1[-1] > nums2[idx2]nums1[-1]undefined,所以这个比较永远是false,这正是作者想要的。

如果你曾经写过这样的代码,你应该添加注释来解释它为什么有效,因为它依赖于 Javascript 的特性,这些特性不会转移到其他语言中,并且对阅读的每个人来说都不是显而易见的代码。