javascript常量真的是常量吗?在redux?

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

我的存储中有这个reducer,初始状态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
}
现在,我的存储正在使用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