这不是纯函数



我正在学习用于Web开发的状态管理,并在下面遇到具有纯函数的Redux教程。但是该声明: " action.todo.id = state.todos.length 1;"让我怀疑这种纯粹的功能是……不纯净的。请启发我,谢谢!

export function rootReducer(state: IAppState, action): IAppState {
    switch (action.type) {
        case ADD_TODO:
            action.todo.id = state.todos.length + 1;    
            return Object.assign({}, state, {
                todos: state.todos.concat(Object.assign({}, action.todo)),
                lastUpdate: new Date()
            })
        case TOGGLE_TODO:
            var todo = state.todos.find(t => t.id === action.id);
            var index = state.todos.indexOf(todo);
            return Object.assign({}, state, {
                todos: [
                    ...state.todos.slice(0, index),
                    Object.assign({}, todo, {isCompleted: !todo.isCompleted}),
                    ...state.todos.slice(index+1)
                ],
                lastUpdate: new Date()
            })
        case REMOVE_TODO:
            return Object.assign({}, state, {
                todos: state.todos.filter(t => t.id !== action.id),
                lastUpdate: new Date()
            })
        case REMOVE_ALL_TODOS:
            return Object.assign({}, state, {
                todos: [],
                lastUpdate: new Date()
            })
    }
    return state;
}

tl; dr-不。

让我们检查纯函数的定义。来自Wikipedia:

在计算机编程中,纯函数是一个具有以下属性:

  1. 其返回值对于相同的参数是相同的(没有任何变化局部静态变量,非本地变量,可变参考来自I/O设备的参数或输入流(。

  2. 其评估没有副作用(无局部静态变量突变,非本地变量变量,可变参考参数或I/O流(。

尽管您的功能确实符合第二条件,但使用new Date()-使其不纯净。

在您的情况下,其杂质的原因是每个功能调用的日期都不同 - 无论传递的参数如何。

为了使其纯净,您应该将日期作为附加参数传递,这将使您可以对相同的输入具有相同的输出。

Zaptree还提到突变您的项目ID的长度,即 action.todo.id = state.todos.length + 1不纯净,因为它可能会影响参考它的其他各方。

您在意识到以下代码不纯净时非常正确:

action.todo.id = state.todos.length + 1;

正确执行此操作的方法将是以下(使用ES5语法,就像您一样(:

var newTodo = Object.assign({}, action.todo, {
  id: state.todos.length + 1
});
return Object.assign({}, state, {
    todos: state.todos.concat(Object.assign({}, newTodo)),
    lastUpdate: new Date()
})

在您的原始代码中,您基本上是在突变从动作传递的托多(Todo(。

相关内容

  • 没有找到相关文章

最新更新