我正在研究javascript,结果出乎我的意料,我不知道我要去哪里错,请按照以下可测试的示例进行操作:
const createStore = () => ({
state: {
life: 100
},
mutations: {
reduceOneOfLife(state) {
state.life -= 1;
},
reduceValueOfLife(state, valueForReduce) {
state.life -= valueForReduce;
}
},
getters: {
currentLife(state) {
return state.life;
}
},
commit(keyMutation, payload) {
!payload ? this.mutations[keyMutation](this.state) : this.mutations[keyMutation](this.state, payload);
},
get(KeyGetters) {
return this.getters[KeyGetters](this.state);
}
});
const store = createStore();
store.mutations.reduceValueOfLife(store.state, 0);
let currentLife = store.get('currentLife');
console.log(currentLife); // -> 100
console.log(currentLife === 100); // -> true
store.commit('reduceValueOfLife', 10);
currentLife = store.get('currentLife');
console.log(currentLife); // -> 90
console.log(currentLife === 100); // -> false
store.commit('reduceValueOfLife', 0);
currentLife = store.get('currentLife');
console.log(currentLife); // -> NaN
console.log(currentLife === 90); // -> false
我希望在测试store.commit('reduceValueOfLife', 0);...
中得到 90 和 true 。
答案 0 :(得分:2)
您的sin(N) = sin(PD)*sin(P)/sin(ND)
函数具有:
commit
也就是说,只有commit(keyMutation, payload) {
!payload ? this.mutations[keyMutation](this.state) : this.mutations[keyMutation] (this.state, payload);
},
是 truthy 时,第一个表达式才运行。但是你的
payload
使用 falsey store.commit('reduceValueOfLife', 0);
值进行调用,因此运行以下命令:
payload
,其中this.mutations[keyMutation](this.state)
为keyMutation
。因此,您的'reduceValueOfLife'
函数
reduceValueOfLife
以reduceValueOfLife(state, valueForReduce) {
state.life -= valueForReduce;
console.log('subtr ' + valueForReduce + ' --- ' + typeof valueForReduce);
}
作为valueForReduce
进行调用,并从最初的undefined
中减去undefined
得出state.life
。
更好地检查NaN
是否为 undefined ,而不只是 falsey ,然后您的payload
返回一个数字值,而不是store.get
:
NaN
您的commit(keyMutation, payload) {
if (payload === undefined) this.mutations[keyMutation](this.state)
else this.mutations[keyMutation](this.state, payload);
},
的另一种选择是简单地*用commit
和[keyMutation]
调用this.state
函数,而不是检查是否定义了参数。如果payload
的{{1}}是commit
,则传递的第二个参数将是payload
,这与您不传递第二个参数时会看到的行为相同完全没有。
undefined
如果您希望最终的undefined
为100,那么在第二部分中将其减少为90后,则必须致电
commit(keyMutation, payload) {
this.mutations[keyMutation](this.state, payload);
},
在最后一部分将其递增回至100:
currentLife
答案 1 :(得分:1)
您遇到的问题是因为0
是(“ falsey”)(以及null
,undefined
,''
,NaN
,当然还有{ {1}})
这意味着false
作为第二个参数传入this.mutations[keyMutation](this.state)
时将被执行
0
虽然您可以简单地测试是否使用commit(keyMutation, payload) {
!payload ? this.mutations[keyMutation](this.state) : this.mutations[keyMutation](this.state, payload);
},
,但这意味着您永远无法传递payload === undefined
作为有效载荷
相反,您可以使用undefined
来检查函数已调用了多少个参数,如下所示:
arguments.length