我们可以在任何地方使用`const`而不是`let`吗?

时间:2016-10-18 12:40:14

标签: javascript arrays ecmascript-6 immutability flowtype

使用flowtype我们更喜欢constlet

我的功能需要以最高效的方式工作,它对我有用,它比较两个数组,所以它是我的问题的一个很好的例子:

/**
* @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 个答案:

答案 0 :(得分: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)));
}

答案 1 :(得分:1)

如果您没有更改它的价值,那么您可以随处使用它。不同之处在于您无法更改const的值。除了一个之外没有其他差异

答案 2 :(得分:0)

为什么您更喜欢const而不是letconst拥有它不会让自己改变的财产。尝试改变它时,你不会得到错误。相反,它只会保持其初始值。 您发布的代码绝对没有const的位置。