javascript - 有没有办法在函数调用中更改对对象的原始引用
问题描述
我正在使用 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 仍然是一种纯粹的按值传递语言。虽然我认为它可能会在某个时候改变,但在撰写本文时它还没有(而且在我看来真的不太可能)。如果你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));
}
推荐阅读
- mysql - SQL查询中的缩短语句
- java - G1GC 导致内存逐渐增长,full GC 将其降低
- ios - Flutter 应用没有 Runner/Runner
- javascript - 这个 ES6 重构准确吗?
- matrix-synapse - 矩阵突触数据库中每个用户的房间
- r - 对于循环存储问题
- parameters - 用于 params.social 的 Hugo config.toml 值以显示 stackoverflow 配置文件
- angular - 在 Angular9 中,根据当前路由生成指向不同站点的帮助链接
- javascript - 理解 Promise 中的 .catch 方法
- json - 在 shell 中运行循环以运行 java