javascript - 将参数 "0"传递给函数时接收 NaN

标签 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

我预计在测试中会得到 90true store.commit('reduceValueOfLife', 0);...

最佳答案

您的commit功能有:

commit(keyMutation, payload) {
    !payload ? this.mutations[keyMutation](this.state) : this.mutations[keyMutation]    (this.state, payload);
},

也就是说,第一个表达式仅在 payload 时运行是真实。但你的

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);
}

被调用 valueForReduceundefined ,并减去undefined从任何state.life最初的结果是 NaN .

最好检查是否 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.statepayload 。如果commitpayloadundefined ,那么传递的第二个参数将是 undefined ,这与您根本不传递第二个参数时会看到的行为相同。

commit(keyMutation, payload) {
  this.mutations[keyMutation](this.state, payload);
},

如果你想要决赛currentLife为 100,在第二部分减少到 90 后,您必须调用

store.commit('reduceValueOfLife', -10);

在最后一部分将其增加到 100:

const createStore = () => ({
  state: {
    life: 100
  },
  mutations: {
    reduceOneOfLife(state) {
      state.life -= 1;
    },
    reduceValueOfLife(state, valueForReduce) {
      state.life -= valueForReduce;
      console.log('subtr ' + valueForReduce + ' --- ' + typeof valueForReduce);
    }
  },
  getters: {
    currentLife(state) {
      return state.life;
    }
  },
  commit(keyMutation, payload) {
    if (payload === undefined) this.mutations[keyMutation](this.state)
    else 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', -10);
currentLife = store.get('currentLife');
console.log(currentLife);
console.log(currentLife === 100);

关于javascript - 将参数 "0"传递给函数时接收 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52360490/

相关文章:

javascript - 从 HTTPS 页面强制 AJAX 调用为 HTTPS

c# - 得到一个错误,可能是WebResource.axd

c - 用指针输入定义函数

function - Haskell函数返回一个数的所有幂直到给定的最大值

java - (Java) 使用 Math.acos 时 double 中出现奇怪的 NaN

r - 如何对向量内的数值求和?

python - 从数据帧/系列中提取时缺失值的奇怪行为

javascript - Powershell 无法扩展此 javascript 内容

javascript - handlebars.js 未捕获类型错误 : Object #<Object> has no method 'call'

c - 使数组指向另一个数组的内存 C