【问题标题】:Side effect/ changing global varaibles that pass into a function副作用/更改传递给函数的全局变量
【发布时间】:2015-03-03 06:12:27
【问题描述】:

如果有人问过这个问题,请原谅我,但我似乎找不到。

我正在尝试创建一个数组并将其反转(不使用反转) 这段代码完美运行:

function reverseArrayInPlace(array) {
  for (var i = 0; i < Math.floor(array.length / 2); i++) {
    var old = array[i];
    array[i] = array[array.length - 1 - i];
    array[array.length - 1 - i] = old;
  }
  return array;
}


var arrayValue = [1, 2, 3, 4, 5];
reverseArrayInPlace(arrayValue);
console.log(arrayValue);
// → [5, 4, 3, 2, 1]

如您所见,它接受array,执行一些逻辑,并返回相同的更改array

虽然,我不明白为什么这段代码不起作用:

var some_array = [6,7,8,9,10];

function reverseArrayInPlace(array) {
    var replacement_array = [];
    for (var i = 0; i < some_array.length; i++)
        replacement_array.unshift(array[i])
    array = replacement_array;
    return array;
}

reverseArrayInPlace(some_array);
console.log(some_array);
// → [ 6, 7, 8, 9, 10 ]

此代码还接收一个数组,执行一些逻辑(和赋值)并返回一个数组。为什么它不像第一个那样改变全局变量?有什么办法可以改变它吗?

【问题讨论】:

  • 因为您正在创建一个新数组,这就是 replacement_array=[] 所做的。请注意,在 JS 中,一切都是按值传递的。此外,replacement_array 缺少 var

标签: javascript arrays global-variables variable-assignment


【解决方案1】:

好的,你需要这个:

function reverseArrayInPlace(array) {
   replacement_array = [];
   for (var i = 0; i <array.length; i++)
   { 
       replacement_array.unshift(array[i])

   }
   for(var i = 0; i <array.length; i++){
       array[i]=replacement_array[i]
   }
   return array;
}
some_array = [6,7,8,9,10];
reverseArrayInPlace(some_array)
console.log(some_array)

替换变量的内容会起作用。

【讨论】:

  • 谢谢,在意识到我必须更改变量的内容之后,这正是我想要的。谢谢。
【解决方案2】:

单步执行代码:

function reverseArrayInPlace(array) {
    var replacement_array = [];
    for (var i = 0; i < some_array.length; i++)
        replacement_array.unshift(array[i])

此时您已经创建了一个与原始数组相反的新数组。

    array = replacement_array;

array 分配一个新值不会改变原始数组;只有可变数组方法或元素取消引用才能实现这一点。

    return array;
}

您在此处返回新数组,因此您可以在函数之外执行赋值:

some_array = reverseArrayInPlace(some_array);
console.log(some_array);

但是,这不再符合就地修改数组的条件;你可以使用unshift()splice()

for (var i = 1, n = array.length; i < n; ++i) {
    array.unshift(array.splice(i, 1)[0]);
}

【讨论】:

  • 感谢您将其分解,这更清楚地说明了为什么分配不起作用。但是,我一直在寻找就地修改数组,您能否举一个最佳方法的示例?
  • @ApathyBear 好吧,我给出了一个替代方案;不确定它的性能如何,但如果你想要高性能的代码,你应该使用reverse() =p
【解决方案3】:

直接影响全局:

    var some_array = [6,7,8,9,10];
    
    function reverseArrayInPlace(array) {
        var replacement_array = [];
        for (var i = 0; i < array.length; i++)
            replacement_array.unshift(array[i]);
        for (var i = 0; i < array.length; i++)
            array[i] = replacement_array[i];
    }
     
    reverseArrayInPlace(some_array);
    alert(some_array);

你不需要返回数组。

【讨论】:

  • 这不是我想要做的。我希望代码能够处理任何全局数组,而不仅仅是硬编码的。
  • 我刚刚更新了我的答案。这就是你所追求的吗?
  • 不完全是,我想简单地调用reverseArrayInPlace(some_array); 并更新全局(就像第一个示例中的完成方式一样)。这可能吗?
  • 你必须替换变量的内容。 array 参数不是对外部数组的严格引用,它是一个新值,恰好持有一个引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多