('b' + 'a' + + 'a' + 'a').toLowerCase() выводит анатомию банана

JavaScript

предисловие

Когда я сегодня просматривал Weibo, я увидел вопрос, опубликованный блогером. Код выглядит следующим образом:

('b' + 'a' + + 'a' + 'a').toLowerCase()
// "banana"

Первой реакцией в то время было то, что JavaScript сообщит об ошибке, но этого не произошло. Потом появился интерес

препарировать

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

Поэтому я сначала проверил на MDN.Приоритет оператора JavaScript

Позвольте мне перечислить операторы и приоритеты, используемые в приведенном выше коде:

приоритет Тип операции Актуальность оператор
20 круглые скобки n/a (...)
16 унарный положительный знак справа налево + ...
13 добавление слева направо ... + ...

Хорошо, разобравшись с приведенными выше операторами, давайте теперь разделим приведенный выше код.

Первое местоtoLowerCaseУбрана, эта функция бесполезна, она просто играет запутанную роль.

'b' + 'a' + + 'a' + 'a'
// to 
'b' + 'a' + (+ 'a') + 'a'

Теперь давайте посмотрим一元正号инструкция:

Оператор NOARARY PLUS предшествует своему операнду, оценивает ценность своего операнда и попытки преобразовать его в номер, если операнд не является числом. Хотя значок «Унарный минус» также может преобразовать не цифровые типы, знаки Удинарного плюс является самым быстрым способом преобразования других объектов в номера и является наиболее рекомендуемой практикой, поскольку она не выполняет никаких избыточных операций по номерам. Он может конвертировать строки в целочисленные и плавающие формы, а также не строковые значения True, false и null. Десятичные и шестнадцатеричные форматические струны также могут быть преобразованы в числовые значения. Отрицательные струны формы также могут быть преобразованы в числовые значения (не применимые для шестнадцатеричных). Если он не может разрешить значение, он оценивает на нэн.

Обратите внимание на предложение выше:如果操作数不是一个数值,会尝试将其转换成一个数值а также如果它不能解析一个值,则计算结果为 NaN

код выше+ 'a'станетNaN, процесс выглядит следующим образом:

'b' + 'a' + (+ 'a') + 'a'
// to
'b' + 'a' + Number('a') + 'a'
// to
'b' + 'a' + NaN + 'a'

Это намного понятнее, и тогда это включает неявное преобразование.Одно из правил знака плюс в JavaScript заключается в том, что когда один из операторов является строковым типом, другой также должен быть преобразован в строковый тип. то естьNaNвыполнятьtoString. ЭтоNaNЧто выполняется? существуетECMA-262Есть инструкции, как показано на рисунке:

Imgur

то естьNaNпревратится в"NaN". Таким образом, приведенный выше код становится таким:

'b' + 'a' + NaN + 'a'
// to
'b' + 'a' + "NaN" + 'a'

toLowerCaseФункция в нижний регистр, становитсяbanana


правильный:

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