Можем ли мы использовать `const` вместо`let` везде?

С flowtype мы предпочитаем const против let

У меня есть функция, которая должна работать максимально эффективно, и она хорошо работает для меня, она сравнивает два массива, поэтому это хороший пример для моего вопроса:

/**
* @function compare
* @description function compares two arrays with ids to figure out: are they equal? (elements position can be different)
* @param arraFrom {Array}
* @param arraTo {Array}
* @param compareFunction {Function}
* @returns {Boolean}
*/
function compare(arraFrom, arraTo, compareFunction) {
  let notEqual = true;
  if(arraFrom.length !== arraTo.length) return false;
    for (let i = 0; i < arraFrom.length; i++) {
      notEqual = true;
      for (let j = 0; j < arraTo.length; j++) {
        if (compareFunction ?
            compareFunction(arraFrom[i], arraTo[j]) :
          arraFrom[i] === arraTo[j]) {
          notEqual = false;
          break;
        }
      }
      if (notEqual) return false;
   }
   return true;
}

Вопрос: как мы можем это реализовать, не используя let самым быстрым способом?

Спасибо!

3 ответа

Решение

Вместо того, чтобы перебирать массивы, изменяя индексные переменные, вы можете использовать for…of петли:

function compare(arraFrom, arraTo, compareFunction) {
  let notEqual = true;
  if(arraFrom.length !== arraTo.length) return false;
  for (const a of arraFrom) {
    notEqual = true;
    for (const b of arraTo) {
      if (compareFunction ? compareFunction(a,b) : a === b) {
        notEqual = false;
        break;
      }
    }
    if (notEqual) return false;
  }
  return true;
}

Вместо этого изменчивого notEqual флаг, вы можете просто вернуться рано:

function compare(arraFrom, arraTo, compareFunction) {
  if (arraFrom.length !== arraTo.length) return false;
  outer: for (const a of arraFrom) {
    for (const b of arraTo) {
      if (compareFunction ? compareFunction(a,b) : a === b) {
        continue outer;
      }
    }
    return false;
  }
  return true;
}

Но это довольно нечитаемо. Я бы рекомендовал использовать следующее:

function compare(arrayFrom, arrayTo, compareFunction) {
  if (arrayFrom.length !== arrayTo.length) return false;
  const test = typeof compareFunction == "function"
    ? a => b => compareFunction(a, b)
    : a => b => a === b;
  return arrayFrom.every(a => arrayTo.some(test(a)));
}

Если вы не измените его значение, вы можете использовать его везде. Разница в том, что вы не можете изменить значение const. Никаких других отличий кроме этого нет.

Почему именно вы предпочитаете const над let?const есть свойство, которое не позволит себе измениться. Вы не получите и ошибку при попытке изменить его, хотя. Вместо этого он просто сохранит свое первоначальное значение. Код, который вы разместили, не имеет абсолютно никакого места для const,

Другие вопросы по тегам