如何在 javascript 中修改函数内部的全局变量,即就地修改变量

How to modify a global variable inside a function in javascript, i.e. modify variable in-place

因此,您可以在下面找到我针对 Leetcode's challenge 189 'Rotate Array' 的(非常基本且未优化的)解决方案。 本次挑战的目标如下:给定一个数组,将数组向右旋转 k 步,其中 k 为非负数。

现在,我的解决方案不被接受,因为不知何故全局变量 nums 在函数调用后保持不变。这是为什么?不知何故 nums 被视为局部变量并且不会更改传入的全局变量 nums。我知道这可能是因为 javascript 如何处理变量范围,但我似乎没有找到可以帮助我理解这个例子的资源。

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var rotate = function(nums, k) {
    array2 = Array.from(nums)
    nums.map((num) => {
        array2[(nums.indexOf(num)+k)%nums.length] = num
    })
    nums = Array.from(array2)
    console.log(nums) // returns expected answer
};
Your input
[1,2,3,4,5,6,7]
3

Your stdout
[5,6,7,1,2,3,4]

Your answer
[1,2,3,4,5,6,7]

Expected answer
[5,6,7,1,2,3,4]

map函数不修改原数组。此外,您似乎没有正确使用它。

您正在使用 map 设置 array2 的值,然后将 nums 设置为 array2 的副本。这不会修改 nums.

中包含的原始对象

当然,如果您在函数内登录 nums,它会为您提供更新后的值,但此值在函数内作用域内,无法在外部访问。

对于这种不纯的编程,您应该使用 for 循环,而不是数组方法。

var rotate = function(nums, k) {
    array2 = Array.from(nums);
    for (const i in nums) nums[i] = array2[(i+k)%nums.length];
};

您的方法是正确的,但问题在于:

var rotate = function(nums, k) {
    array2 = Array.from(nums)
    nums.map((num) => {
        array2[(nums.indexOf(num)+k)%nums.length] = num //Making changed to array2
    })
    nums = Array.from(array2) //Completely changing the reference of nums
    console.log(nums) // returns expected answer
};

let nums =  [1,2,3,4,5,6,7];
rotate(nums,3); 
console.log(nums); //Original nums still as it is

如果你看上面的代码,nums实际上并没有改变。原因是您正在创建一个全新的数组 array2。在您的 .map() 中,您正在对其进行各种更改并将其重新分配回 nums。但是原来的引用nums没变

您实际上应该更改 nums 并使用 array2 寻求帮助:

var rotate = function(nums, k) {
        array2 = Array.from(nums)
        array2.forEach((num) => {
        nums[(array2.indexOf(num)+k)%array2.length] = num
        })
        console.log(nums) // returns expected answer
    };

let nums =  [1,2,3,4,5,6,7];
    rotate(nums,3);
    console.log(nums);

PS: .map() 是你想要返回一个新的转换数组的时候。否则,您可以简单地使用 .forEach 或 for 循环。