javascript - javascript const 真的是不变的吗?在还原?
问题描述
我的商店中有这个减速器,初始状态initialProcessingState
是从另一个源文件导入的。
import {
ACTN_IS_PROCESSING
} from '../config/action-types.js';
import { initialProcessingState } from "./redProcessing-initial.js";
export default function (state = initialProcessingState, action) {
switch (action.type) {
case ACTN_IS_PROCESSING:
return {
...state,
...action.isProcessing
}
default:
return state;
}
}
这是源文件中定义的方式:
export const initialProcessingState = {
keys: [],
mostRecentStatus: false,
neverStale: true
}
现在我的商店通过订阅将状态持久化到本地存储中
store.subscribe(() => {
updateLocalStorage(store);
})
像这样...
import { initialProcessingState } from "../reducers/redProcessing-initial.js";
var updateLocalStorage = debounce((store) => {
const state = store.getState();
var _state = {
...state,
isProcessing: { ...initialProcessingState }
};
localStorage.setItem('reduxState', JSON.stringify(_state))
}, 100);
我的意图是isProcessing
用它的初始状态覆盖,如const
上面在initialProcessingState
.
不幸的是不起作用。因为每一次updateLocalStorage
调用的值initialProcessingState
都不是初始值,而是后续reducer调用的当前更新状态。
这怎么可能?这是一个const
。
我的临时修复涉及JSON.parse(JSON.stringify(initialProcessingState))
:
const _initialProcessingState = JSON.parse(JSON.stringify(initialProcessingState));
var updateLocalStorage = debounce((store) => {
const state = store.getState();
//this is not the best way
console.log("updateLocalStorage", "initialProcessingState", initialProcessingState, _initialProcessingState);
var _state = {
...state,
isProcessing: { ..._initialProcessingState }
};
localStorage.setItem('reduxState', JSON.stringify(_state))
}, 100);
以下不足以使其正常工作:
const _initialProcessingState = initialProcessingState;
有人可以帮忙吗?
解决方案
const 声明创建对值的只读引用。这并不意味着它持有的值是不可变的,只是不能重新分配变量标识符。例如,在内容是对象的情况下,这意味着可以更改对象的内容(例如,它的属性)。
来源:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const
编辑
Object.freeze()
正如@Apolo 在他的评论中指出的那样,提及这一点可能很重要。
对象
Object.freeze() 方法冻结一个对象。无法再更改冻结的对象;冻结对象可防止向其添加新属性、删除现有属性、防止更改现有属性的可枚举性、可配置性或可写性,并防止更改现有属性的值。此外,冻结对象还可以防止其原型被更改。
Object.freeze()
然而,同样重要的是要注意它没有扩展到冻结对象所拥有的值:
请注意,作为对象的 [对象] 的值仍然可以修改,除非它们也被冻结。
数组
作为一个对象,一个数组可以被冻结;这样做之后,它的元素就不能被改变,也不能从数组中添加或删除任何元素。
编辑部分的来源: https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze
推荐阅读
- android - 从与 ViewPager 连接的片段获取数据到 Activity 的问题
- python - RecursionError:与进行二分搜索相比,超出了最大递归深度
- cmake - 如何指定 vcpkg 使用的 CMake 版本
- javascript - 有条件的.then执行
- android - 按文件夹分组布局 (Android)
- android - 使用 okhttp 进行带有整数值的发布请求
- reactjs - 必需的 babel-jest 依赖项
- html - 在 html 上请求图像时,如何处理基于不记名令牌的身份验证?
- javascript - 使用 jquery 将值附加到表单并序列化 AJAX Post 的表单
- python - 嵌入在 C++ 中的 python 脚本没有在循环中第二次运行