Как показано на , этот сайт , как a, так и b будет представлен как
0 10011100 10001001100010001010011
в стандарте IEEE для поплавков, где первый бит является знаком, следующий 8 - показатель, а остальные 23 - мантисса. В этих 23 битах просто недостаточно места для представления разницы, потому что показатель настолько велик.
+'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');
'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'
('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, который можно проверить.
Это только из-за [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 путями:
Поэтому назад к исходному запросу; Здесь это пытается преобразовать следующий символ в число, но внезапно мы получили ошибку 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);
Эта строка кода оценивает выражение и затем называет метод на основе возвращенного значения.
выражение ('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, называют, который оставляет нас с бананом.
Так...
главное здесь, чтобы знать сначала и извлечь уроки из использует +
, прежде чем любое значение в JavaScript, преобразует то значение в номер , но если то значение не может быть преобразовано, механизм JavaScript возвратится NaN, что означает, не номер (не может быть преобразован в число, помощника!) и остальная часть истории как указано ниже:
Read больше о NaN в W3Schools или Сеть разработчиков
MozillaПосмотрите волшебство здесь. Второй плюс унарный оператор, который дает 'NaN'
console.log(('b' + 'a' + + 'a' + 'a').toLowerCase());
console.log(('b' + 'a' + + 'a' + 'a'));
console.log(('b' + 'a' + 'a' + 'a').toLowerCase());