首页 > 解决方案 > 有没有办法在函数调用中更改对对象的原始引用

问题描述

我正在使用 JavaScript 中的数组,想知道为什么我对数组所做的更改正确地保存到 localStorage,但在函数调用之后没有反映在数组中。代码如下:

function removeFromList(array, arrayName, key) {
  array = array.filter(function(element) { return element.key !== key; });
  localStorage.setItem(arrayName, JSON.stringify(array));
}

我做了一些谷歌搜索,通过一些旧帖子,发现数组是按值传递给函数的,也就是说,指向数组对象的数组变量是按值传递的,而更改该副本并没有影响指向我的数组对象的原始变量。

我想出了以下代码作为解决方法:

function removeFromList(array, arrayName, key) {
  arrayTemp = array.filter(function(element) { return element.key !== key; });
  for(var i = 0; i < array.length; i++) {
    if (!arrayTemp.some(item => item.key === array[i].key)) {
      array.splice(i, 1);
    }
  }
  localStorage.setItem(arrayName, JSON.stringify(array));
}

这解决了我的问题,数组的新内容同时显示在 localStorage 和原始变量指向的数组对象中。但是,我一直想知道最近是否在 JavaScript 中引入了一些新方法,或者我没有发现可以更好地实现预期结果的旧方法。

标签: javascript

解决方案


我做了一些谷歌搜索,通过一些旧帖子,发现数组是按值传递给函数的,也就是说,指向数组对象的数组变量是按值传递的,而更改该副本并没有影响指向我的数组对象的原始变量。

非常正确。

有没有办法在函数调用中更改对对象的原始引用

不,JavaScript 仍然是一种纯粹的按值传递语言。虽然我认为它可能会在某个时候改变,但在撰写本文时它还没有(而且在我看来真的不太可能)。如果你example(x)x包含42(或数组引用)时这样做,仍然没有任何方法example可以伸出手来改变(到 43,或引用不同的数组)的值。x如果x引用一个可变对象(如数组),example则可以修改该对象,但不能x引用一个全新的对象。

您的解决方法通过修改现有数组来工作。FWIW,通常最好返回新数组,因此调用者可以选择保留原始数组或使用新数组。例如:

function removeFromList(array, arrayName, key) {
    array = array.filter(function(element) { return element.key !== key; });
    localStorage.setItem(arrayName, JSON.stringify(array));
    return array;
}

然后在使用时:

variableContainingArray = removeFromList(variableContainingArray, "nameInLocalStorage", 42);

但是如果你想就地更新,你不需要一个临时数组:

function removeFromList(array, arrayName, key) {
    // Looping backward we don't have to worry about the indexes when we remove an entry
    for (let i = array.length - 1; i >= 0; --i) {
        if (array[i].key === key) {
            array.splice(i, 1);
        }
    }
    localStorage.setItem(arrayName, JSON.stringify(array));
}

推荐阅读