2016-10-18 38 views
0

隨着flowtype我們寧願constlet我們可以在任何地方使用`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'的實際含義。它是*常數*的縮寫。當你想改變它的值時,如何在你的代碼中有一個*常量*變量(可能聽起來會有些矛盾)? –

+0

這個問題就像是一個「請重寫我的代碼」請求,隱藏在一個有趣的問題的幌子下。 – evolutionxbox

+0

所有的'let'都可以用'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而不是letconst有財產,它不會讓自己改變。嘗試更改時不會出現錯誤。相反,它會保持其初始值。 您發佈的代碼絕對沒有const的地方。

+1

它會出錯!! .. – Keith

+0

取決於你在哪裏執行它。節點似乎並不介意。對不起,如果瀏覽器有。請注意。 – ThatBrianDude

相關問題