Найти в Дзене
Глеб Кудес

Странности и фишки JavaScript. Часть 1.

Доброго времени суток. Данная статья несет развлекательный характер, т.к. то, о чем я вам поведую невозможно применить на практике (хотя я вам не запрещаю). Знать подобные вещи нужно хотя бы для того, чтобы похвастаться перед друзями и коллегами. Приятного просмотра. BananaScript О данном примере, я думаю, слышали многие: console.log( ('b' + 'a' + + 'a' + 'a').toLowerCase() ) 'banana' Прямо сейчас откройте консоль (shift+i) и проверьте сами Что? Но как? Откуда тут вообще взялось n, откуда появились лишние a? Это магия JavaScript, друг мой. Давайте разберемся по порядку. Когда мы используем операцию прибавления, где хотя бы один из слагаемых имеет тип "Строка", то у нас происходит конкатенация.
Это вы можете увидеть, если сложить 2 + '2', ответом будет '22'. Такую же ситуацию мы имеем тут. Тадаам, 'banana'! Дробный хаос Перейдем к сути 0.1 + 0.2 === 0.3 false Почему? Очень просто, все это благодаря бинарности, числа с плавающей запятой не могут быть округлены до 100% точности, из-за эт
Оглавление

Доброго времени суток.

Данная статья несет развлекательный характер, т.к. то, о чем я вам поведую невозможно применить на практике (хотя я вам не запрещаю). Знать подобные вещи нужно хотя бы для того, чтобы похвастаться перед друзями и коллегами. Приятного просмотра.

BananaScript

О данном примере, я думаю, слышали многие:

console.log( ('b' + 'a' + + 'a' + 'a').toLowerCase() )
'banana'

Прямо сейчас откройте консоль (shift+i) и проверьте сами

-2

Что? Но как? Откуда тут вообще взялось n, откуда появились лишние a? Это магия JavaScript, друг мой. Давайте разберемся по порядку.

Когда мы используем операцию прибавления, где хотя бы один из слагаемых имеет тип "Строка", то у нас происходит конкатенация.
Это вы можете увидеть, если сложить 2 + '2', ответом будет '22'. Такую же ситуацию мы имеем тут.

  1. В самом начале, как не странно, произойдет основной механизм, после которого все станет понятно. 'b' + 'a' + + 'a' + 'a'. Операция + 'a' попробует преобразовать 'a' к числу, но т.к. это невозможно, то результатом мы получим NaN (Not a Number), не число, проще говоря.
  2. 'b' + 'a' = 'ba'
  3. 'ba' + NaN = 'baNaN'
  4. 'baNaN' + 'a' = 'baNaNa'
  5. Ну и на последок мы опустим все буквы в нижний регистр с помощью метода toLowerCase().

Тадаам, 'banana'!

Дробный хаос

Перейдем к сути

0.1 + 0.2 === 0.3
false

Почему? Очень просто, все это благодаря бинарности, числа с плавающей запятой не могут быть округлены до 100% точности, из-за этого появляются остатки, так например 0.1 + 0.2 = 0.30000000000000004. Странно, да, но нужно к этому привыкнуть и не забывать округлять.

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

http://0.30000000000000004.com/

Нет пути обратно

Посмотрите на этот код

1 < 2 < 3
3 > 2 >1

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

1 < 2 < 3 //true
3 > 2 >1 //false

Без лишней моей актерской игры (КАК ЭТО РАБОТАЕТ?!) Перейдем к сути. Тут господствует уже известное нам приведение типов

  1. 1 < 2 //true
  2. true < 3 (true приводится к числу и становится 1)
  3. 1 < 3 // true

Что насчет второго примера?

  1. 3 > 2 // true
  2. true > 1 (true приводится к числу и становится 1)
  3. 1 > 1 // false

NaNi(N)?!

Ну а на последок забавная вещь. Если вы введете в консоле typeof NaN, то вам вернется тип NaN. Чтобы вы не мучались, просто расшифрую аббревиатуру заголовка. Not a Number is Number. Что с перевода с забугорного: Не число, это число. И это правда!

typeof NaN // 'number'

И такое бывает.

На этом я хотел бы закончить статью. Если вам понравился формат, буду рад вашему лайку, ведь только так я смогу понять, продолжать ли мне рубрику 'Странности и фишки JavaScript'. Всем пока!