2016-10-18 36 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

相关问题