javascript常量真的是常量吗?在redux?
我的存储中有这个reducer,初始状态initialProcessingState是从另一个源文件导入的javascript常量真的是常量吗?在redux?,javascript,ecmascript-6,redux,redux-thunk,Javascript,Ecmascript 6,Redux,Redux Thunk,我的存储中有这个reducer,初始状态initialProcessingState是从另一个源文件导入的 import { ACTN_IS_PROCESSING } from '../config/action-types.js'; import { initialProcessingState } from "./redProcessing-initial.js"; export default function (state = initialProcessingState, ac
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
}
现在,我的存储正在使用subscribe将状态持久化到localstorage
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,初始状态在initialProcessingState中定义为const
不幸的是,这不起作用。因为每次调用updateLocalStorage时,initialProcessingState的值不是初始值,而是后续reducer调用的当前更新状态
怎么可能呢?这是一个常数
我的临时修复程序是include JSON.parseJSON.stringifyinitialProcessingState:
以下几点还不足以让它发挥作用:
const _initialProcessingState = initialProcessingState;
有人能帮忙吗?initialProcessingState的值是对对象的引用。该值不能更改
它引用的对象可以进行变异
const声明创建对值的只读引用。信息技术
并不意味着它所持有的值是不可变的,只是变量
无法重新分配标识符。例如,如果
内容是一个对象,这意味着对象的内容,例如
属性可以更改
资料来源:
编辑
正如@Apolo在评论中指出的,提及Object.freeze可能很重要
物体
Object.freeze方法冻结对象。冻结的物体不能移动
不再需要改变;冻结对象可防止新属性丢失
添加到其中后,现有属性将不会被删除,从而防止
更改的可枚举性、可配置性或可写性
现有属性,并阻止现有属性的值
避免被改变。此外,冻结对象还可以防止其损坏
原型不被改变
但是,对于Object.freeze,还需要注意的是,它没有扩展到冻结对象所持有的值:
请注意,作为对象的[对象的]值仍然可以修改,除非
它们也被冻结了
阵列
作为对象,数组可以冻结;这样做之后,它的元素
不能更改,也不能向中添加或从中删除任何元素
数组
编辑部分中的Source:const表示无法重新分配引用。这就是为什么在分配字符串或数字时,它们保持不变,但在分配对象和数组时,可以通过它们的引用修改其内容,使其不可变。来源:
const声明创建对值的只读引用。信息技术
并不意味着它所持有的值是不可变的,只是变量
无法重新分配标识符。例如,如果
内容是一个对象,这意味着对象的内容,例如
属性可以更改
您可以查看,但这只会冻结第一层:
const foo=Object.freeze{
酒吧:“baz”,
baz:{foo:'bar'}
};
foo.bar='foo';//将不会更改,因为foo已冻结
foo.baz.foo='foo';//将更改,因为foo.baz未冻结
console.dirfoo javascript常量与其他语言中的常量不同。常数不是不变的。如果常量引用对象或数组,则对象可以更改,但不能重新分配常量。为了澄清这一点:常量的常量是对对象/值的引用。这是无法改变的。对象本身及其属性可以进行变异。想一想const biologicalFather={…};这是不变的,永远不会改变。面部毛发不是恒定不变的。所有的更改都将应用于/对所有引用过他的人可见。如果能为那些寻找创建不可变对象方法的人添加一个关于Object.freeze的词,那就太好了
const _initialProcessingState = initialProcessingState;
const foo = { bar : 'baz' };
foo.bar = 'foo'; // works, because it doesn't change what foo is.
foo = null; // will fail, since it tries to change what foo is