Использование возможностей ECMAScript 6 в Javascript; Когда использовать функции жирной стрелки и т. Д.? - PullRequest
0 голосов
/ 10 января 2019

Я прохожу курс удэми 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, но я не мог придумать лучшего способа реализации своих функций. И я не мог понять, как использование жирных стрелок улучшит код. Поэтому я с нетерпением жду предложений и отзывов.

Ответы [ 4 ]

0 голосов
/ 10 января 2019

Я не уверен в контексте, но нет никаких оснований полагать, что циклы по своей природе плохие. Возможно, вы захотите знать о влиянии на производительность вложенности циклов, но классические циклы for используются достаточно часто, и нет никаких причин не использовать их.

Что касается функций со стрелками, в вашем случае преимущества могут заключаться в том, что ваш код более лаконичен и удобен для чтения. Функции со стрелками - это просто сокращенный способ написания функций. Чаще всего удобочитаемость важнее, чем небольшие улучшения производительности, которые вы можете получить или не получить, используя функции стрелок, потоки и функции функционального программирования, представленные в ES6.

В вашем случае было бы неплохо использовать некоторые функции стрелок, чтобы сделать ваш код более лаконичным. Таким образом, вы можете заменить цикл for путем потоковой передачи массива char и использования .forEach.

0 голосов
/ 10 января 2019

Я думаю, что ваш код в порядке. Это просто и легко понять. Однако это определенно не то, что нынешние хипстеры 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

Это функция высшего порядка (имеется в виду функция, которая принимает функцию в качестве одного из аргументов). Это общий случай использования жирных стрел просто потому, что обозначения в конечном итоге гораздо более краткие.

Примечание: я мог бы скептически относиться к любому курсу, который "настоятельно рекомендует против" для циклов. Но, возможно, они просто пытаются заставить вас использовать новые функции JS.

0 голосов
/ 10 января 2019

Функция уменьшения может использоваться для перебора строки и возврата одного значения. уменьшение

Функции стрелок используются для лексической области видимости этого. Функции стрелок

Обновление функций 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); }
0 голосов
/ 10 января 2019

Мое личное мнение таково, что функции стрелок работают лучше всего, когда вам не нужно привязывать this к текущему контексту функции. На данный момент это не имеет никакого смысла для вас, но функции arrow не имеют своего собственного ключевого слова this , что означает, что значение this будет выведено за пределы лексическая область действия функции стрелки. Они хороши и для обратных вызовов (применимо то же правило, что и выше), также, когда вам нужно написать короткое выражение, оно выглядит аккуратно. Все зависит от вас, просто убедитесь, что вы знаете, как этот ведет себя, и вы будете в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...