2016-10-18 3 views
0

С flowtype мы предпочитаем const против letМожем ли мы использовать `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 наиболее эффективным образом?

Спасибо!

+4

Остановитесь и подумайте немного о том, что означает 'const'. Это аббревиатура * constant *. Как будет иметь переменную * constant * (как бы озонороническую, которая может звучать) в вашем коде, если вы хотите изменить ее значение? –

+0

Этот вопрос выглядит как запрос «пожалуйста, переписывайте мой код», скрытый под видом интересного вопроса. – evolutionxbox

+0

Ни один из ваших 'let''s не может быть заменен на' const', поскольку все они меняются. 'const' предназначен для постоянных переменных и доступен только для чтения –

ответ

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

Разве это не беспорядок с тем, как должен действовать 'const'? Как, будучи постоянным? Кроме того, будьте осторожны с 'for ... of': https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of#Browser_compatibility –

+0

@ EmilS.Jørgensen Как значение a и b никогда не будет мутировано, я не вижу ничего плохого в использовании 'const'. – evolutionxbox

+0

-_- потому что последний пример более читабельн ... – evolutionxbox

1

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

0

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

+1

Это будет ошибка! .. – Keith

+0

Зависит от того, где вы ее выполняете. Узел, похоже, не возражает. Извините, хотя браузеры. Отмечу это. – ThatBrianDude

Смежные вопросы