[英]Making use of ECMAScript 6 features in Javascript; When to use fat arrow functions, etc.?
我正在自己學習 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
我的函數檢測到永遠無法平衡的括號並提前退出,這是課程中的示例沒有做到的。 我想在重構和改進代碼時保留此功能。
本課程強烈建議不要使用 for 循環,但我想不出更好的方法來實現我的功能。 而且我看不出使用粗箭頭函數會如何改進代碼。 所以我期待着建議和反饋。
我認為你的代碼很好。 它直截了當且易於理解。 然而,它絕對不是當前的 javascript 時髦人士認為的酷或其他什么。
不幸的是,如果不使用像 for 循環這樣的傳統循環結構,當括號永遠無法平衡時,您無法提前退出。 所以老實說,你的功能可能比他們正在尋找的更有效率。 但一般來說,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
它是一個高階函數(意味着將函數作為其參數之一的函數)。 這是粗箭頭的常見用例,因為符號最終變得更加簡潔。
注意:我可能會對“強烈建議反對”for 循環的任何課程持懷疑態度。 但也許他們只是想讓你使用新的 JS 功能。
我個人的觀點是,當您不必將this綁定到當前函數上下文時,箭頭函數效果最好。 在這一點上,這對您沒有任何意義,但箭頭函數沒有自己的this關鍵字,這意味着this的值將超出箭頭函數的詞法范圍。 它們也適用於回調(上述規則適用),而且當您需要編寫簡短的表達式時,它看起來很整潔。 這一切都取決於你,只要確保你知道這是如何表現的,你就會沒事的。
Reduce 函數可用於迭代字符串並返回單個值。 降低
箭頭函數用於 this 的詞法范圍。 箭頭函數
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); }
我不確定上下文,但沒有理由相信 for 循環天生就不好。 您可能希望了解嵌套 for 循環對性能的影響,但經典 for 循環的使用已經足夠頻繁,因此沒有理由不使用它們。
就箭頭函數而言,在您的情況下,優點可能是您的代碼更簡潔且更易於閱讀。 箭頭函數只是編寫函數的一種簡寫方式。 通常情況下,可讀性比使用 ES6 中提供的箭頭函數、流和函數式編程特性可能會或可能不會獲得的微小性能改進更重要。
對於您的情況,使用一些箭頭函數使您的代碼更簡潔可能會很好。 因此,您可以通過流式傳輸 char 數組並使用.forEach
來替換 for 循環。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.