Получение NaN при передаче аргумента "0" в функцию - PullRequest
0 голосов
/ 17 сентября 2018

Я изучаю 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

Я ожидал получить 90 и true в тесте store.commit('reduceValueOfLife', 0);....

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Проблема, с которой вы столкнулись, заключается в том, что 0 ("фальси") (наряду с null, undefined, '', NaN и, конечно, 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 примерно так:

commit(keyMutation, payload) {
    (arguments.length < 2) ? this.mutations[keyMutation](this.state) : this.mutations[keyMutation](this.state, payload);
},
0 голосов
/ 17 сентября 2018

Ваша commit функция имеет:

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

То есть первое выражение выполняется, только если payload равно truey . Но ваш

store.commit('reduceValueOfLife', 0);

вызывает со значением falsey 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.

Лучше проверить, является ли payload 1031 * неопределенным , а не просто falsey , и тогда ваш 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. Если commit s payload равно undefined, то второй передаваемый аргумент будет 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);
...