предисловие
Когда я сегодня просматривал 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Есть инструкции, как показано на рисунке:
то естьNaNпревратится в"NaN". Таким образом, приведенный выше код становится таким:
'b' + 'a' + NaN + 'a'
// to
'b' + 'a' + "NaN" + 'a'
toLowerCaseФункция в нижний регистр, становитсяbanana
правильный:
Если вам это не нравится, просто закройте его. Вместо того, чтобы тратить время на его распыление, лучше посмотреть другие статьи.