Здравствуйте, читатели. Это будет мой первый пост, и я хотел бы начать с чего-то смешного, но с долей серьезности. Какое-то странное поведение в JavaScript. Стоит отметить, что даже если эти примеры JavaScript немного странные, это не ошибки (или, по крайней мере, не неожиданные ошибки).

1. Ты любишь бананы?

Это один из моих любимых. Это отлично подходит для обмена между разработчиками. Кроме того, это легко объяснить.

Пояснение

Давайте посмотрим, что происходит шаг за шагом. Первая часть ('b' + 'a') работает, как и ожидалось. Однако волшебство зависит от этой части + + ‘a’. JavaScript пытается автоматически преобразовать следующий код + ‘a’ в строку. Это приводит к следующему результату: NaN. Наконец, JavaScript объединяет 'ba' + NaN, в результате чего получается строка 'baNaNa'. Мы можем использовать функцию `.toLowerCase()`, чтобы увидеть этот банан.

2. Конечно, правда?

Объяснение
Ну, это странно, не так ли? Это происходит из-за того, как JavaScript оценивает код. Давайте посмотрим…

Теперь это имеет немного больше смысла :D

3. Добавление массивов

Объяснение
Конкатенация выполняется следующим образом.

4. Функционирование функции setTimeOut()

Пояснение

Это происходит потому, что обратный вызов для setTimeout перемещается в конец контекста выполнения. Использование setTimeout с 0 в качестве второго параметра сообщает JavaScript, что обратный вызов является частью нового контекста выполнения и что текущий блок завершен. Перед выполнением обратного вызова JavaScript проверит, нет ли ожидающих событий. Вот почему код внутри функции setTimeout выполняется в конце.

5. Почти 3

Пояснение

Константы 0,2 и 0,3 в вашей программе будут приближенными к их фактическим значениям. Бывает, что ближайшее к 0,2 плавающее значение больше рационального числа 0,2, но ближайшее к 0,3 значение меньше рационального числа 0,3. Сумма 0,1 и 0,2 оказывается больше рационального числа 0,3 и, следовательно, приводит к другому значению в коде.

Я знаю, это звучит странно, но проблема очень хорошо задокументирована и встречается на разных языках. Подробнее об этом → 0.30000000000000004.com

6. Math.max() меньше, чем Math.min()?

Объяснение
Самый простой способ увидеть это поведение — шаг за шагом

7. NaN === NaN, ложь?

Объяснение
Давайте посмотрим на спецификацию IEEE.

1. Если `Type(x)` отличается от `Type(y)`, вернуть false.
2. Если `Type(x)` – число, затем
→ a. Если `x` равно NaN, вернуть false.
→ b. Если `y` равно NaN, вернуть false.

По сути, каждый NaN отличается от любого другого NaN, в конце концов, у нас есть значение, которое не является числом.

Ссылка

Харви, К. (2015, 23 февраля). _Почему Math.max() меньше, чем Math.min()?_ Charlieharvey.org.uk; charlieharvey.org.uk.

Денисдовань. (2012). _denysdovhan/wtfjs: список забавных и хитрых примеров JavaScript_. Гитхаб.

Халперн, Б. (2019, 29 августа). _Какое самое странное поведение JavaScript?_ Сообщество разработчиков; Сообщество разработчиков.

Шарма Х. (2019, 12 августа). _Почему результат ("b"+"a"+ + "a" + "a").toLowerCase() "банан"?_ Stack Overflow.

«Хосейни, М. (2013, 29 августа). _Зачем использовать setTimeout в deferred_. Переполнение стека."