Почему результат ('b' + 'a' + + 'a' + 'a'). ToLowerCase () 'banana'?

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

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

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

480
задан BSMP 24 August 2019 в 23:24
поделиться

8 ответов

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

document.write(+'a');
К нижнему регистру это становится banana.

Добавление NaN к "ba" повороты NaN в строку "NaN" из-за преобразования типов, дает baNaN. И затем существует a позади, давая baNaNa.

пространство между [1 113] должно сделать первую одну конкатенацию строк и вторую унарным плюс (т.е. "положительный") оператор. У Вас есть тот же результат, если Вы используете 'ba'+(+'a')+'a', разрешенный как [1 115], который эквивалентен [1 116] должный ввести манипулирование.

document.write('ba'+(+'a')+'a');
555
ответ дан 22 November 2019 в 22:16
поделиться
'b' + 'a' + + 'a' + 'a'

... оценен как....

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

<глоток> <глоток> (см.: приоритет оператора )

(+'a') попытки преобразовать 'a' в число с помощью унарный плюс оператор . Поскольку 'a' не число, результат NaN ( "Не-номер" ):

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

, Хотя NaN обозначает "Не Число", это - все еще числовое тип ; при добавлении к строкам это конкатенирует, как любое другое число было бы:

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

Наконец, это печатало строчными литерами:

'baNaNa'.toLowerCase()      =>  'banana'
83
ответ дан 22 November 2019 в 22:16
поделиться
('b' + 'a' + + 'a' + 'a').toLowerCase()

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

Шаг один

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

Движение L-R, мы имеем:

  • 'b' + 'a' возвраты ba, это - регулярная конкатенация.
  • ba + + 'a' попытки конкатенировать ba с + 'a'. Однако начиная с унарного оператора + попытки преобразовать его операнд в число, значение NaN возвращается, который затем преобразовывается в строку при конкатенации с оригиналом ba - таким образом приводящий к [1 130] baNaN.
  • baNaN + возвраты банан . Снова, это - регулярная конкатенация.

На данном этапе, результат шага каждый банан .

Шаг два

Применение .toLowerCase() на значении, возвращенном от шага, каждый дает:

банан

существуют многие подобная игра слов в JavaScript, который можно проверить.

35
ответ дан 22 November 2019 в 22:16
поделиться

Это только из-за [1 121] + оператор.

Мы можем получить дальнейшее знание от блока это.

=> ( ('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';

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

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

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

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

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

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

, И в последний раз это преобразовывает его в toLowerCase (), Таким образом, это был бы банан

, Если Вы будете помещенным числом рядом с ним, то Вашим результатом будет изменение.

( '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);
24
ответ дан 22 November 2019 в 22:16
поделиться

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

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

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

неявные принятые меры являются призывом к ToNumber на строке

  • , ToNumber Обратился к Строковому типу "ToNumber, относился к Строкам, применяет грамматику к входной строке. Если грамматика не может интерпретировать Строку как расширение StringNumericLiteral, то результатом ToNumber является NaN".

интерпретатор имеет правила того, как проанализировать выражение путем разламывания его на его компоненты левых и правых ручных выражений.

<час>

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

Левое Выражение: 'b'
Левое Значение: оператор 'b'

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

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

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

<час>

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

Левое Выражение: 'ba'
Левое Значение: оператор 'ba'

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

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

Результат: <час> 'baNaN'

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

Левое Выражение: 'baNaN'
Левое Значение: оператор 'baNaN'

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

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

Результат: 'банан'

<час>

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

9
ответ дан 22 November 2019 в 22:16
поделиться

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

Так...

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

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

7
ответ дан 22 November 2019 в 22:16
поделиться

enter image description here

Read больше о NaN в W3Schools или Сеть разработчиков

Mozilla
2
ответ дан 22 November 2019 в 22:16
поделиться

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

console.log(('b' + 'a' + + 'a' + 'a').toLowerCase());
console.log(('b' + 'a' + + 'a' + 'a'));
console.log(('b' + 'a' + 'a' + 'a').toLowerCase());
0
ответ дан 22 November 2019 в 22:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: