利用Javascript中的ECMAScript 6功能;何时使用粗箭头功能等?

时间:2019-01-10 16:32:01

标签: javascript ecmascript-6

我正在独自完成Udemy课程ES6 Javascript: The Complete Developer's Guide Stephen Grider。本课程是我第一次接触javascript。 (对我而言)它包含一个有趣的练习,用于检测括号是否平衡。我用期望的功能编写了一个函数,但没有使用粗箭头函数。我可能没有使用本可以使用的其他ECMAScript 6功能。我想要任何有关改进我的代码的建议。

function balancedParens(inputString){
  const errMsg1 = 'ERROR: expression will NEVER be balanced';
  const errMsg2 = 'ERROR: unbalanced!';
  const successMsg = 'parens are balanced.';
  const chars = inputString.split("");
  let count = 0;
  for ( let i = 0; i < chars.length; ++i ) {
    if ( count < 0 ) { console.log(errMsg1); return false; }
    if ( chars[i] === "(" ) { ++count; }
    else if ( chars[i] === ")" ) { --count; }
  }
  if ( count < 0 ) { console.log(errMsg1); return false; }
  else if ( count == 0 ) { console.log(successMsg); return true; }
  else { console.log(errMsg2); return false; }
}

balancedParens("()()(i)"); //correctly returns true
balancedParens("()()())"); //correctly returns false

我的函数检测到永远无法平衡的Parens,并尽早解决,这是课程中的示例所没有做到的。我想在重构和改进代码时保留此功能。

本课程强烈建议您不要使用for循环,但是我想不出一种更好的方法来实现我的功能。而且我看不到使用粗箭头功能如何改善代码。因此,我期待提出建议和反馈。

4 个答案:

答案 0 :(得分:1)

我认为您的代码很好。它简单明了,易于理解。但是,绝对不是当前的javascript赶时髦的人会认为很酷的东西。

不幸的是,没有使用像for循环这样的传统循环结构,当parens无法平衡时,您不能提早退出。因此,说实话,您的功能可能比他们想要的功能更有效。但是一般来说,JavaScript潮人并不真正在乎代码效率。

这可能是他们想要的东西

const balancedParens = inputString =>
        
        // We don't need curly brackets here because we're doing everything
        // on one "line" and just returning
    	inputString.split('')

        // Reduce is the substitute for your for loop here.
        // It iterates over each character and stores the return value in "sum"
        // on each iteration
    	.reduce((sum, char) => {
    		if (char === '(') return sum + 1;
    		else if (char === ')') return sum - 1;
    		else return sum;

        // This comparison makes the entire function return true if
        // our reduce resulted in zero, otherwise false
        }, 0) === 0;


const logResult = result =>
    result ? console.log('parens are balanced.')
    : console.log('ERROR: unbalanced!');
    
logResult(balancedParens('()()(i)'));
logResult(balancedParens('()()())'));

如果您不熟悉数组上的reduce函数,请在此处查看: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

它是一个高阶函数(意味着将一个函数作为其参数之一的函数)。这是粗箭头的常见用例,只是因为符号最终变得更简洁。

注意:对于“强烈反对”循环的任何课程,我可能都持怀疑态度。但是也许他们只是想让您使用新的JS功能。

答案 1 :(得分:0)

我个人认为,当不必将 this 绑定到当前功能上下文时,箭头功能最有效。此时,这对您没有任何意义,但是 arrow 函数没有自己的 this 关键字,这意味着 this 的值将为超出箭头函数的词法范围。 它们也适合回调(上面的相同规则适用),当您需要编写短表达式时,它看起来也很整洁。一切都取决于您,只是确保您知道这种行为的行为,您会没事的。

答案 2 :(得分:0)

Reduce函数可用于遍历字符串并返回单个值。reduce

箭头功能用于此功能的词汇范围。Arrow functions

ES5功能的升级-绑定,调用和应用。

 const errMsg1 = 'ERROR: expression will NEVER be balanced';
const errMsg2 = 'ERROR: unbalanced!';
const successMsg = 'parens are balanced.';
balancedParanthesis = (string) => {
    return string.split("").reduce((count, char) => {  //returns boolean expression
    
        if(count < 0 ){return count;}
        else if(char === '('){++count;}
        else if(char === ')'){ --count;}
        return count;       
    },0)
}
    
let count = balancedParanthesis("()()");
//let count = balancedParanthesis("((())");
//let count = balancedParanthesis(")((())");
if ( count < 0 ) { console.log(errMsg1); }
else if ( count == 0 ) { console.log(successMsg);  }
else { console.log(errMsg2); }

答案 3 :(得分:0)

我不确定上下文,但是没有理由相信for循环本来就很糟糕。您可能想知道嵌套for循环对性能的影响,但是经典的for循环经常使用,因此没有理由不使用它们。

就箭头功能而言,在您的情况下,优点可能是您的代码更简洁,更易于阅读。箭头函数只是编写函数的一种简便方法。通常,可读性比使用ES6中提供的箭头功能,流和功能编程功能可能会或可能不会带来的微小性能提升更为重要。

对于您的情况,最好使用一些箭头功能使代码更简洁。因此,您可以通过流式传输char数组并使用.forEach来替换for循环。