我正在使用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
伸手去改变值的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] 删除。
我来说两句