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

阴影

我正在使用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,或者我发现没有一种较旧的方法可以更好地实现预期的结果。

TJ人群

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

非常正确。

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

不,JavaScript仍然是纯粹的按值传递语言。尽管我认为可能在某个时候进行更改,但在撰写本文时还没有更改(对我来说,似乎真的不可能)。如果这样做example(x),当x包含42(或阵列参考),仍然没有任何方式example伸手去改变x(〜43,或指代不同的阵列)。如果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));
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有没有办法在 unordered_set 中保留对对象的引用/指针?

有没有办法从方法中调用对象?

有没有办法在javascript中调用对象内的所有函数?

有没有办法在ListView中调用函数?

有没有办法获得对原始元素的引用,该元素与进行 Ajax 调用的函数相关联?

有没有办法知道超类构造函数中调用对象的子类?C ++

有没有办法从函数返回新对象或对现有对象的引用?

有没有办法引用当前对象的类

有没有办法在使用列表时不更改列表中的原始值?

有没有办法在Unity中粉碎对象?(通过划分原始网格)

有没有办法调用部分函数

有没有办法将函数调用传递给内部对象?

JavaScript中有没有办法减少递归函数调用中的调用栈大小?

有没有办法在调用 nodejs 中的控制器之前调用函数

有没有办法让函数调用“继续”影响其调用者中的循环?

有没有办法在vue中引用图像?

有没有办法使成员函数不能从构造函数中调用?

有没有办法在单独的 js 文件中为 jquery click() 函数调用函数?

有没有办法避免可观察对象中的循环引用?

有没有办法通过引用传递属性或字段以在函数中更新它?

有没有办法通过引用传递属性或字段以在函数中更新它?

有没有办法在打字稿定义中引用函数自变量?

有没有办法在TypeScript函数文档中引用参数?

有没有办法使用 ByteBuddy 在 Java 代理中检索调用方“对象”?

有没有办法动态检索对象方法并在python中调用它们?

有没有办法在Kotlin中从内部调用匿名函数?

有没有办法以角度调用html属性值中的函数?

有没有办法从bash函数调用中强制回显命令行?

有没有办法一次在JavaScript中多次调用函数?使用木偶