const getLetter = (name, numLetter) => name[numLetter - 1] || ‘’;
Разьясните непонятливому как работает это выражение !!!
const getLetter = (name, numLetter) => name[numLetter - 1] || ‘’;
Разьясните непонятливому как работает это выражение !!!
Здравствуйте. А где само условие? Я тут вижу лишь функцию которая принимает name и numLetter. А так же результат логических выражений “или”.
Как я понял, а точнее прогуглил, ваше решение связано с логическими выражениями. А, именно, извлекает из переданной строки указанный символ (по порядковому номеру, а не по его индексу) и возвращает его наружу. Если такого символа нет, то функция возвращает пустую строку.
test(‘test’, () => {
const name = ‘Hexlet’;
expect(f(name, 0)).toBe(‘’);
expect(f(name, 1)).toBe(‘H’);
expect(f(name, 6)).toBe(‘t’);
expect(f(name, 7)).toBe(‘’);
expect(f(name, 11)).toBe(‘’);
});
const getLetter = (name, numLetter) => name[numLetter - 1] || '';
В переменную getLetter записывается функция. Функция с двумя аргументами. Функция возвращает результат выражения name[numLetter - 1] || ''
. Стрелочный синтаксис функции позволяет “опускать” return
, но неявный return
все равно присутствует.
(name, numLetter) => name[numLetter - 1] || ''
все это выражение это объявление анонимной функции. Только тут “опущена” часть необязательных символов. Эквивалент этой функции могла бы быть вот такая функция ниже. Единственная разница между ними это то во что вычисляется this
, но в данном контексте this
не играет роли потому что не используется в теле функции.
function (name, numLetter) {
return name[numLetter - 1] || ''
}
Далее смотрим на выражениеname[numLetter - 1]
. Со строками можно работать как с массивами, обращаясь по индексу к сиволу. 'mama'[1] === 'a' // true
. name[numLetter - 1]
выражение вычисляется в символ который имеет индекс в строке numLetter - 1
. Кстати, как и с массивом, если попробовать вычислить элемент с большим индексом чем длина строки, то выражение вычислется в undefined
. 'mama'[999] === undefined // true
.
Про ||
. Выражения типа a || b
вычисляются или в a
или в b
(в отличии от других языков где логические операторы возвращают булевые значения). a || b
вычисляется в a
если булевый эквивалент a
это true
. В b
если булевый эквивалент a
это false. Кстати, быстро узнать булевый эквивалент значения можно в консоли браузера, применив двойное отрицание к значению. !!'mam' === true // true
и !!'' === false
. Булевые эквиваленты false
, null
, undefined
, 0
, ''
, NaN
это false
. У всех других значений (пустой массив, строка с пробелом, пустой объект итд) булевый эквивалент true
.
Зная вышесказанное name[numLetter - 1] || ''
можно понять так “выражение вернет символ с индексом numLetter - 1
или пустую строку если сивол по тому индексу отсутствует (undefined
)”.
И чтобы добавить еще измерение для понимания, я перепешу функцию на более многословный и более однозначный формат
const getLetter = function (name, numLetter) {
if (name[numLetter - 1]) {
return name[numLetter - 1]
} else {
return ''
}
}
Спасибо огромное за столь ёмкое обьяснение. Респект!
Думаю, если бы почаще расписывали такие, вроде незамысловатые функции для начинающих, то обучаться было бы значительно эффективнее. К сожалению примеры составлены таким образом, что многие явные или неявные вещи просто ускользают от неопытных. Ещё раз огромное спасибо.
Пожалуйста. Я рад что моя работа полезна.
Описанная механика про непонятки деталей подмечена верно. Понимающие авторы курса должны организовывать процесс так чтобы непонятки можно было выяснить или с теми кто разобрался с вопросом или с самими авторами курса (для авторов это общение будет работать как обратная связь, они лучше поймут какие есть промахи материале).
Если же авторы не организовали систему так чтобы подобные вопросы можно было решать, то лучшее что может сделать обучающийся это
Кстати, форум и меня можно поддержать на патреоне http://patreon.com/podgorniy