Можем ли мы использовать `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
,