簡體   English   中英

在 Javascript 中使用 ECMAScript 6 特性; 什么時候使用粗箭頭函數等?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM