为什么Redux能够更改初始化reducer的CONSTANT输出



我在使用Redux时遇到了非常非常奇怪的行为。基本上,我有一个静态地图的游戏,玩家在地图上移动。地图和玩家由彩色div表示。这就是我所要做的,我曾短暂地让它发挥作用。

我通过首先获得空地图(这是一个硬编码的const阵列),然后在正确的坐标添加玩家的(新)位置来创建移动。然后我将其渲染到React中的视图层。输出的带有玩家位置的新地图是而不是,名称与空地图相同。

然而,Redux发生了一些非常奇怪的事情,当我渲染它时,它以某种方式更改了硬编码的const数组。放入大量console.log来查看变量的情况,可以确认这就是发生的事情。有人能看看这个代码笔吗?

http://codepen.io/swyx/pen/MJbezj?editors=1010

教我如何用我多变的常数来追踪到底发生了什么?

编辑:这是相关的代码(constMap是数组的const数组)

const InitMap = function() {
console.log('InitMap')
return constMap  /// why is this changing every single time???
}

这种减速器后来与其他减速器结合使用:

const rootReducer = combineReducers({
gamemap: InitMap,
user: InitUser,
userMove: UserMove
});

然后在相关的mapStateToProps函数中使用:

function GMmapStateToProps(state){
//from here goes into this.props
console.log('GMmapStateToProps')
console.log(state)
console.log(constMap)
var newgamemap = constMap, //state.gamemap also doesnt work,
newuser = state.user
console.log(newgamemap)
if (state.userMove) {
//check if is whitespace
var x2 = newuser.location.x + state.userMove.vector.x
var y2 = newuser.location.y + state.userMove.vector.y
if (newgamemap[y2][x2] === 1) {
newuser.location.x = x2
newuser.location.y = y2
//add user
newgamemap[newuser.location.y][newuser.location.x] = 9
}
} else {    
//add user
newgamemap[newuser.location.y][newuser.location.x] = 9
}
console.log(newgamemap)
return{
xgamemap: newgamemap,
user: newuser
}
}

可笑的是,每次我调用constMap时,它的值都在不断变化!为什么/如何?这让我怀疑自己的理智。

这是因为const不会创建不可变的。来自MDN、

const声明创建对值的只读引用。这并不意味着它所持有的值是不可变的,只是不能重新分配变量标识符。例如,如果内容是一个对象,这意味着对象本身仍然可以更改。

因此以下是有效的

const myArr = []
myArr.push(1)
myArr = [1,2,3] //throw error
const myObj = {}
myObj['test'] = true

如果需要,请查看Object.freeze

在@cartant的帮助下,这里的问题是我不知道javascript通过引用而不是通过值传递数组和对象。当然,通过给数组指定一个不同的名称,我并没有做任何改变最终结果的事情。当然,javascript没有原生的深度复制方法,因为javascript。所以我想,如果未来的人遇到这种情况,就走深度复制的路线:用JavaScript深度克隆对象最有效的方法是什么?

最新更新