将参数“ 0”传递给函数时接收NaN

时间:2018-09-17 03:47:15

标签: javascript function nan

我正在研究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

2 个答案:

答案 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”)(以及nullundefined''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