Я практиковался в JavaScript, когда один из моих друзей наткнулся на этот код JavaScript:

document.write (('b' + 'a' + + 'a' + 'a'). ToLowerCase ());

Приведенный выше код отвечает на "банан"! Кто-нибудь может объяснить почему?

HV Sharma

Ответов: 8

Ответы (8)

+ 'a' преобразуется в NaN («Не число»), потому что он приводит строку к числу, в то время как символ a не может быть разбирается как число.

document.write (+ 'a');
banana

Добавление 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')) // Here + + convert it to +operator 
Which later on try to convert next character to the number.

Например

const string =  '10';

Преобразовать строку в число можно двумя способами:

  1. Число (строка);
  2. + строка;

Итак, вернемся к исходному запросу; Здесь он пытается преобразовать следующий символ ('a') в число, но внезапно мы получили ошибку NaN,

( ('b') + ('a') + (+'a') + ('a'))
( ('b') + ('a') + NaN + ('a'))

Но он рассматривается как строка, потому что предыдущий символ был в строке. Так будет

( ('b') + ('a') + 'NaN' + ('a'))

И, наконец, он преобразует его в toLowerCase (), так что это будет банан

Если вы поставите рядом цифру, Ваш результат изменится.

( 'b' + 'a' +  + '1' + 'a' ) 

It would be 'ba1a'

const example1 = ('b' + 'a' + + 'a' + 'a'). ToLowerCase (); // 'банан'
const example2 = ('b' + 'a' + + '1' + 'a'). toLowerCase (); // 'ba1a'
console.log (пример1);
console.log (пример2);

Смотрите здесь волшебство. Второй плюс - унарный оператор, который дает NaN

.

console.log (('б' + 'а' + + 'а' + 'а'). ToLowerCase ());
console.log (('б' + 'а' + + 'а' + 'а'));
console.log (('b' + 'a' + 'a' + 'a'). toLowerCase ());

enter image description here

Узнайте больше о NaN на W3Schools или Mozilla Developer Network

Использование + преобразует любое значение в число в JavaScript!

Итак ...

Главное, что здесь нужно знать в первую очередь и чему поучиться, - это использовать + перед любым значением в JavaScript, преобразует это значение в число, но если это значение не может быть преобразовано , Движок JavaScript вернет NaN, что означает, не число (не может быть преобразовано в число, дружище!), А остальная часть истории, как показано ниже:

Why is the result of ('b'+'a'+ + 'a' + 'a').toLowerCase()'banana'?

('b' + 'a' + + 'a' + 'a').toLowerCase()

Для наглядности разделим это на два этапа. Сначала мы получаем значение выражения в скобках, а затем применяем к результату функцию toLowerCase ().

Шаг первый

'b' + 'a' + + 'a' + 'a'

Идет Л-П, имеем:

  • 'b' + 'a' возвращает ba, это обычная конкатенация.
  • ba + + 'a' пытается объединить ba с + 'a'. Однако, поскольку унарный оператор + пытается преобразовать свой операнд в число, возвращается значение NaN, которое затем преобразуется в строку при объединении с исходным ba. - в результате получаем baNaN.
  • baNaN + 'a' возвращает baNaNa. Опять же, это обычная конкатенация.

На этом этапе результат первого шага будет baNaNa.

Шаг второй

Применение .toLowerCase () к значению, возвращенному с первого шага, дает:

banana

Есть много похожих каламбуров в JavaScript, которые вы можете проверить.

'b' + 'a' + + 'a' + 'a'

... оценивается как ....

'b' + 'a' + (+'a') + 'a'

(см .: приоритет оператора)

(+ 'a') пытается преобразовать 'a' в число с помощью унарного оператора плюс. Поскольку 'a' не является числом, результатом будет NaN («Not a Number»):

'b'  +  'a'  +  NaN  + 'a'

Хотя NaN означает «Не число», это все же числовое тип; при добавлении к строкам он объединяется так же, как и любое другое число:

'b'  +  'a'  +  NaN  + 'a'  =>  'baNaNa'

Наконец, в нижнем регистре:

'baNaNa'.toLowerCase()      =>  'banana'

Эта строка кода оценивает выражение, а затем вызывает метод на основе возвращенного значения.

Выражение ('b' + 'a' + + 'a' + 'a') состоит исключительно из строковых литералов и операторов сложения.

  • Строковые литералы «Строковый литерал содержит ноль или более символов, заключенных в одинарные или двойные кавычки.»
  • Оператор сложения (+) «Оператор сложения выполняет либо конкатенацию строк, либо числовое сложение.»

Предпринятое неявное действие - это вызов ToNumber в строке

  • ToNumber, примененный к типу String «ToNumber, примененный к Strings, применяет грамматику к входной String. Если грамматика не может интерпретировать String как расширение StringNumericLiteral, то результатом ToNumber будет NaN.»

У интерпретатора есть правила того, как анализировать выражение, разбивая его на компоненты левого и правого выражений.


Шаг 1: 'b' + 'a'

Левое выражение: 'b'
Левое значение: 'b'

Оператор: + (одна из сторон выражения является строкой, поэтому объединение строк)

Правое выражение: 'a' Правильное значение: 'a'

Результат: 'ba'


Шаг 2: 'ba' + + 'a'

Левое выражение: 'ba'
Левое значение: 'ba'

Оператор: + (одна из сторон выражения является строкой, поэтому объединение строк)

Правое выражение: + 'a' (это оценивает математическое значение символа 'a', предполагая, что это положительное число от знака + - знак минус также работал бы здесь, указывая отрицательное число - в результате получается NaN)
Правильное значение: NaN (поскольку оператор представляет собой конкатенацию строк, toString вызывается для этого значения во время конкатенации)

Результат: 'baNaN'


Шаг 3: 'baNaN' + 'a'

Левое выражение: 'baNaN'
Левое значение: baNaN

Оператор: + (одна из сторон выражения является строкой, поэтому объединение строк)

Правое выражение: 'a'
Правильное значение: 'a'

Результат: 'baNaNa'


После этого выражение группировки было оценено, и вызывается toLowerCase, что оставляет нас с бананом.

2022 WebDevInsider