我正在独自完成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循环,但是我想不出一种更好的方法来实现我的功能。而且我看不到使用粗箭头功能如何改善代码。因此,我期待提出建议和反馈。
答案 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循环。