('b'+'a'+ + 'a'+'a').toLowerCase() === 'банан'?

JavaScript

Видел вопрос в Твиттере некоторое время назад

На самом деле это базовая тема, а точки проверки — преобразование типов и приоритет операторов.

Прежде всего, не все знаки плюс в этом вопросе используются для сложения.++'a'Второй плюс на самом деле является унарным оператором.

Унарный оператор плюс имеет более высокий приоритет, чем оператор сложения.

Поэтому этот вопрос следует читать так:

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

Затем давайте изучим роль унарного оператора плюс. На самом деле в JS всего девять унарных операторов, а именно:

  • +
  • -
  • !
  • ++
  • --
  • ~
  • typeof
  • delete
  • void

Конечно, тема этой статьи не в том, чтобы представить функции всех унарных операторов, поэтому давайте кратко рассмотрим их.+эффект может быть.

Этот оператор пытается преобразовать что-либо в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.

Если вы считаете, что контент полезен, вы можете обратить внимание на мой официальный аккаунт «Внешняя часть действительно забавная» и регулярно делиться следующими темами:

  • Внешнее мало знаний, холодное знание
  • Основное содержание
  • Увеличение эффективности работы
  • персональный рост