Почему результат ('b'+'a'+ + 'a' + 'a').toLowerCase() равен 'banana'?
Я практиковался в JavaScript, когда один из моих друзей наткнулся на следующий код:
document.write(('b' + 'a' + + 'a' + 'a').toLowerCase());
Этот код выводит строку "banana", и я не могу понять, почему это происходит. Можете ли вы объяснить, как этот код формирует строку "banana"?
3 ответ(ов)
Оператор +'a' возвращает NaN (Not a Number), поскольку он пытается преобразовать строку в число, а символ a не может быть интерпретирован как число.
document.write(+'a');
В результате этого преобразования мы получаем nan в нижнем регистре.
Когда вы добавляете NaN к строке "ba", NaN преобразуется в строку "NaN" из-за приведения типов, что дает baNaN. Затем, добавляя еще одну a, мы получаем baNaNa.
Пробел между + и + нужен для того, чтобы первый + выполнял конкатенацию строк, а второй + работал как унарный оператор (то есть преобразование в положительное число). Вы получите тот же результат, если использовать конструкцию 'ba'+(+'a')+'a', которая разрешается как 'ba'+NaN+'a', эквивалентная 'ba'+'NaN'+'a' из-за автоматического приведения типов.
document.write('ba'+(+'a')+'a');
Причина такого поведения заключается в операторе +.
Давайте разберем это на примерах.
=> ( ('b') + ('a') + (++) + ('a') + ('a'))
=> ( ('b') + ('a') + (+) + ('a') + ('a')) // Здесь + + преобразуется в оператор +
Этот оператор затем пытается преобразовать следующий символ в число.
Например:
const string = '10';
Вы можете преобразовать строку в число двумя способами:
Number(string);+string;
Теперь вернемся к первоначальному вопросу. Здесь оператор пытается преобразовать следующий символ ('a') в число, но возникает ошибка NaN:
( ('b') + ('a') + (+'a') + ('a'))
( ('b') + ('a') + NaN + ('a'))
Однако он рассматривает NaN как строку, поскольку предыдущий символ был строкой. Поэтому это будет выглядеть так:
( ('b') + ('a') + 'NaN' + ('a'))
В конечном счете, после применения метода toLowerCase(), мы получим результат "banana".
Если же вы поставите число рядом, ваш результат изменится:
( 'b' + 'a' + + '1' + 'a' )
В этом случае результатом будет 'ba1a'.
Вот пример кода для ясности:
const example1 = ('b' + 'a' + + 'a' + 'a').toLowerCase(); // 'banana'
const example2 = ('b' + 'a' + + '1' + 'a').toLowerCase(); // 'ba1a'
console.log(example1);
console.log(example2);
Таким образом, итоговый вывод будет зависеть от контекста, в котором используется оператор +.
Эта строка кода действительно показывает интересный момент работы со строками и оператором сложения в JavaScript. Давайте разберем каждую часть.
Первое выражение:
console.log(('b' + 'a' + + 'a' + 'a').toLowerCase());
Здесь происходит следующее:
'b' + 'a'— строка'ba'.- Далее идет
+ 'a'. Поскольку'a'не может быть преобразовано в число, оператор+возвращаетNaN. Теперь у нас есть'ba' + NaN, что дает'baNaN'. - И, наконец, мы добавляем еще
'a', получая'baNaNa'. - Метод
.toLowerCase()приводит строку к нижнему регистру, и в итоге мы получаем'banana'.
Поэтому результат этого вызова console.log будет 'banana'.
Теперь рассмотрим вторую строку:
console.log(('b' + 'a' + + 'a' + 'a'));
Как мы уже разобрали, ('b' + 'a' + + 'a' + 'a') превращается в 'baNaNa' так же, как и в первом случае, так что результатом здесь будет строка 'baNaNa'.
И последний вызов:
console.log(('b' + 'a' + 'a' + 'a').toLowerCase());
Здесь мы просто складываем 'b' + 'a' + 'a' + 'a', что будет 'baaa', и затем применяем toLowerCase(), чтобы получить 'baaa'.
Таким образом, вывод будет следующим:
console.log(('b' + 'a' + + 'a' + 'a').toLowerCase());—'banana'console.log(('b' + 'a' + + 'a' + 'a'));—'baNaNa'console.log(('b' + 'a' + 'a' + 'a').toLowerCase());—'baaa'
Если у вас есть дополнительные вопросы или нужна помощь, не стесняйтесь задавать!
Где найти документацию по форматированию даты в JavaScript?
Как определить нажатие клавиши Esc?
Как проверить, содержит ли массив строку в TypeScript?
Ссылка и выполнение внешнего JavaScript-файла, размещенного на GitHub
Как остановить Babel от трансформации 'this' в 'undefined' и добавления "use strict"