2016-10-18 3 views
0

Mit flowtype bevorzugen wir const gegen letKönnen wir `const` anstelle von` let` überall verwenden?

I Funktion haben, die in den meisten performante Art und Weise gearbeitet werden muss, und es funktioniert gut für mich, es zwei Arrays vergleichen ist, so ist es cool Beispiel für meine Frage:

/** 
* @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; 
} 

Frage ist: wie können wir es implementieren, ohne let in der performantesten Weise zu verwenden?

Vielen Dank!

+4

Stoppen Sie und überlegen Sie, was "const" eigentlich bedeutet. Es ist eine Abkürzung von * constant *. Wie funktioniert es, wenn Sie eine Variable * constant * (wie auch immer oxymorisch das klingt) in Ihrem Code verwenden, wenn Sie ihren Wert ändern möchten? –

+0

Diese Frage fühlt sich an wie eine "bitte schreibe meinen Code" -Anfrage, die unter dem Deckmantel einer interessanten Frage versteckt ist. – evolutionxbox

+0

keine Ihrer 'let's kann durch' const' ersetzt werden, da sie sich alle ändern. 'const' steht für konstante Variablen und ist schreibgeschützt –

Antwort

3

Statt die Anordnungen von Iterieren von Indexvariablen mutiert, können Sie for…of Loops verwenden:

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

Statt dieser wandelbaren notEqual Flagge, können Sie einfach früh zurück:

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

Aber das ist ziemlich unlesbar. Ich würde folgendes empfehlen:

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

Ist das nicht verwirrend mit dem, wie 'const' agieren soll? Wie in, eine Konstante zu sein? Auch vorsichtig mit 'for ... of': https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for ... of #Browser_compatibility –

+0

@ EmilS.Jørgensen Als Wert von a und b werden nie mutiert, ich sehe nichts falsch bei der Verwendung von 'const'. – evolutionxbox

+0

-_- weil das letzte Beispiel besser lesbar ist ... – evolutionxbox

1

Wenn Sie den Wert nicht ändern, können Sie ihn überall verwenden. Der Unterschied ist, dass Sie den Wert von const nicht ändern können. Es gibt keine anderen Unterschiede außer dieser

0

Warum genau bevorzugen Sie const über let? const hat die Eigenschaft, dass es sich nicht ändern lassen wird. Sie werden nicht bekommen und Fehler, wenn Sie versuchen, es zu ändern. Stattdessen wird es nur seinen ursprünglichen Wert behalten. Der von Ihnen gepostete Code hat absolut keinen Platz für const.

+1

Es wird Fehler !! .. – Keith

+0

Hängt davon ab, wo Sie es ausführen. Knoten scheint das nicht zu stören. Tut mir leid, wenn Browser das tun. Wird das beachten. – ThatBrianDude

Verwandte Themen