Видел вопрос в Твиттере некоторое время назад
На самом деле это базовая тема, а точки проверки — преобразование типов и приоритет операторов.
Прежде всего, не все знаки плюс в этом вопросе используются для сложения.++'a'Второй плюс на самом деле является унарным оператором.
Унарный оператор плюс имеет более высокий приоритет, чем оператор сложения.
Поэтому этот вопрос следует читать так:
'b' + 'a' + (+'a') + 'a'
Затем давайте изучим роль унарного оператора плюс. На самом деле в JS всего девять унарных операторов, а именно:
+-!++--~typeofdeletevoid
Конечно, тема этой статьи не в том, чтобы представить функции всех унарных операторов, поэтому давайте кратко рассмотрим их.+эффект может быть.
Этот оператор пытается преобразовать что-либо вnumber, который будет возвращен в случае неудачного преобразованияNaN, вот несколько примеров преобразований:
// 1
+1
// 1
+'1'
// 1
+true
// 0
+null
// 另外还有个骚操作,如果一个对象有 valueOf 的话
// 那么转换的是该函数的返回值
+{
valueOf: () => 1
}
Поэтому для+'a'Например, возвращаемое значение должно бытьNaN.
Теперь вопрос становится таким:
'b' + 'a' + (NaN) + 'a'
несмотря на то чтоNaNУказывает, что значение не является числом, но его тип по-прежнемуnumber. Оператор сложения преобразует числа в строки в процессе сложения чисел и строк, поэтому текущая задача преобразуется в это:
'b' + 'a' + 'NaN' + 'a'
Итак, результатbaNaNa, позвонивtoLowerCase()это становитсяbanana.
наконец
Хоть тема и выглядит простой, но содержание расследования все же многогранно.Конечно, больше всего я хочу рассказать о fuckJS.
Если вы считаете, что контент полезен, вы можете обратить внимание на мой официальный аккаунт «Внешняя часть действительно забавная» и регулярно делиться следующими темами:
- Внешнее мало знаний, холодное знание
- Основное содержание
- Увеличение эффективности работы
- персональный рост