SlideShare a Scribd company logo
Лайфхаки по
изучению JS:
основные ошибки,
совершаемые
программистами
Денис
Самойленко
Summer. Sea. JavaScript.
Откуда нам известны
«ошибки, совершаемые
программистами»?
IT-образование-
ради будущего!
itstep.org
Беларусь
Азербайджан
Грузия
Болгария
Румыния
Мексика
США
Словакия Польша
Молдова
Швейцария
Казахстан
Бразилия
Чехия
Камбоджа
Одесса
Николаев
Херсон
Мариуполь
Запорожье
Кривой Рог
Днепр
Каменское
ХарьковПолтава
Киев
Чернигов
ЖитомирЛьвов
Ивано-Франковск
Черновцы
Тернополь
Луцк
Ровно
Хмельницкий
Винница
Тбилиси
Баку
Минск
Бобруйск
Гомель
Пномпен
Прага
Брно
Рио-де-Жанейро
Астана
Караганда
Алматы
Женева
Кишинев
Варшава
Братислава
Сиэтл
18стран
65
филиалов
Тихуана
Бухарест
София
Могилев
Витебск
Брест
itstep.org
18Стран мира
1400преподавателей
45000
студентов
5000
компьютеров
300аудиторий
Дмитрий Корчевский
Основатель и генеральный директор
Компьютерной Академии ШАГ 120000
выпускников
65
филиалов
itstep.org
СовременностьПрофессионализм Забота
о студентах
Наши ценности
itstep.org
Разработка
программного
обеспечения
Компьютерная
графика и дизайн
Сети и
кибербезопасность
Программа - не имеющая аналогов
по направлениям:
JavaScript…
А нужно ли?
JavaScript – это интерпретируемый язык:
исходный код (текст программы) является и исполнимым кодом.
Это позволяет легко переносить программы на различные устройства:
ПК, планшеты, смартфоны, телевизоры.
Мне показалось или там было «телевизоры»?
Нет, не показалось, есть такой инструмент Samsung SDK специально для
Samsung SmartTV
Кросс-платформенный
JavaScript — это самый быстрый из интерпретируемых языков:
PHP, Ruby, Python и др.
Интерпретатор для JS разрабатывался в конкурентной борьбе – «войне
браузеров», тогда как другие языки – плоды спокойной работы
отдельных групп разработчиков.
Еще скажите, что JavaScript быстрее С++…
По некоторым тестам – да. Мощь JavaScript «съедается» браузером.
А вот без него, например в NodeJS, сомнения отпадают
Быстрый
Концепция Full Stack JavaScript
• browser (JavaScript)
• server (Node.js)
• database (MongoDB)
JavaScript является одним из наиболее востребованных языков на
рынке вакансий IT.
По данным рынка Европы JavaScript уверенно занимает первое место.
Популярный
JavaScript!?
Конечно нужно!
Я знаю С/С++, С#, сам изучил Pascal
Что мне стоит разобраться с JS!?
В браузерах основное предназначение JS — манипуляции с DOM.
10 перестроек 1 перестройка
Именно DOM не дает JavaScript проявить свою скорость…
Особенность 1. DOM
Вариант 1 Вариант 2
for( i=0; i<10; ++i )
label.innerHTML += i
str = ""
for(i=0; i<10; ++i) str += i
label.innerHTML = str
Переменные не нужно объявлять. Переменная создается
автоматически при первом обращении на запись. Это же касается и
полей в классах
Тип указывать не нужно – он будет автоматически определен
О чудесах динамической типизации Вы уже, наверняка, слышали
Особенность 2. Динамическая типизация
С / С++ / С# Pascal / Delphi JavaScript
int x;
x = 10;
var x:integer;
begin
x := 10;
x=10
или
var x=10
// установит красный фон для «element»
element.style.backgroundColor="red"
// создаст новое поле «BackgroundColor», ошибки нет
element.style.BackgroundColor="red"
// а эту «ошибку» я исправлял у каждого второго…
$.ajax({ url: "site.html",
sucsess: function(){...} })
Удобно, но…
JavaScript получает все данные от пользователя или из НТТР-пакета в
символьном (строковом) виде, даже если для этого применяются
элементы числового типа.
Z = X + Y // Z = 311
W = X – Y // W = -8
X.value > Y.value // true
Особенность 3. HTML, HTTP: Т – значит текстовый
С/С++ есть разница: объект - obj.field ссылка - ref->field
В JavaScript создание объектов – это создание ссылок на объекты. Хотя
для доступа применяется оператор «.» (точка)
a = { x:10, y:20 } // а – ссылка на объект { x:10, y:20 }
b = a // b – ссылка на тот же объект, что хранится в а
// казалось бы, меняем значение «b»
b.x = 30 // но…
console.log(a) // а={x: 30, y: 20}
Особенность 4. Ссылочные типы
ООП в JavaScript на более высоком уровне, чем у С/С++ или Pascal.
var f = function(){ alert( "f" ) }
f() // сообщение "f"
f.x = 10 // поле x объекта f
f() // работает как и раньше
f = 20 // новое значение f
f() // ошибка: f – не функция
Особенность 5. Функции – это объекты
Параметрический полиморфизм в JavaScript отсутствует.
А попроще? Функции не перегружаются
А по-человечески? Функции с разными параметрами – это одна и та же функция
function f(){ … } // определяем f
function f(x){ … } // переопределяем f
// в такой форме понятнее, почему f переопределяется
f = function(){ … }
f = function(x){ … }
И из-за того, что функции – это объекты…
Как думаете, какое сообщение выведет последняя строка кода?
f = [] // конструктор массива
for( i=0; i<3; ++i ) // заполнение массива функций
f[i] = function(){ alert(i) }
f[1]() // вызов функции из массива (с индексом 1)
Функция хранится как текст. Обращение к «i» произойдет в момент
вызова, так что i=3. Интерпретация – не компиляция…
И еще о функциях – позднее связывание
А вот тут начинается самое интересное…
Традиции взяли верх – указатель «this» показывает на тот объект,
которому принадлежит функция
a = {
name: "object a",
thisLogger: function(){ console.log( this ) }
}
a.thisLogger() // {name: "object a", thisLogger: ƒ}
Функция – объект. Значит «this» указывает на нее?
Если функция хранится как текст, то действует ли на «this» позднее
связывание? – Еще и как действует!
<div id="div1" ></div>
<script>
div1.onclick = a.thisLogger // а – описан слайдом выше
</script>
Что мы увидим в консоли, когда кликнем по блоку?
Правильно,
ведь функция будет вызвана из блока "div1"
А если добавить позднее связывание…
Функции, как объекты, могут иметь свои поля. Для того чтобы к ним
обратиться нужно…
Именовать анонимные функции – все просто!
f = function self( ) { // named function expression
alert( self.x ) // обращение к «своему» полю х
}
f.x = 10 // поле х объекта f
f() // сообщение – 10
Если «this» это не this, то как добраться до this?
Вариант 1 Вариант 2 Вариант 3
<form onsubmit="handler()">
<input type="submit" value="Go" />
</form>
<script>
function handler(){ return false; }
</script>
<form id="form1">
<input type="submit" value="Go" />
</form>
<script>
form1.addEventListener("submit",
function() { return false; } )
</script>
<form id="form1">
<input type="submit" value="Go" />
</form>
<script>
form1.onsubmit =
function() { return false; }
</script>
Необходимо
onsubmit="return handler()"
Необходимо
function(e){ e.preventDefault(); …
Без дополнений,
все работает
Простая задача - предотвратить отправку HTML-формы
Особенность 6. Обработчики событий
Все определения переменных оператором «var» и функций
перемещаются (поднимаются) в начало области видимости.
Особенность 7. Поднятие определений (hoisting)
Мы пишем А определения поднимаются
for(var i=0; i<3; ++i)
console.log(i)
var i
for(i=0; i<3; ++i)
console.log(i)
Во-первых, это удобно. Не нужно объявлять прототипы функций до
того, как они будут использованы. Функцию можно описать в любом
месте – как до, так и после места первого вызова.
Во-вторых, это необычно. Переменные присутствуют ДО их
объявления.
В-третьих, это опасно. Не запрещено написать «var х» несколько раз. А
значит, можно подменить ранее описанную переменную.
И что такого в этом поднятии?
Для «var» их две – глобальная и функциональная (тело функции)
console.log(i) // udefined
console.log(j) // error
for(var i=0; i<3; ++i) console.log(i)
console.log(i) // 3
В современном стандарте введена инструкция «let i»,
ограничивающая область видимости текущим блоком, однако,
следует помнить и о поведении инструкции «var»
А где границы области видимости?
Что мы увидим в консоли в каждом из вариантов?
function f() {
return 1
}
console.log( f() )
function f() {
return 2
}
console.log( f() )
function f() {
return 1
}
function f() {
return 2
}
var f = function() {
return 1
}
console.log( f() )
var f = function() {
return 2
}
console.log( f() )
var f = function() {
return 1
}
var f = function() {
return 2
}
? ? ? ?
И где тут можно ошибиться программисту?
Что мы увидим в консоли в каждом из вариантов?
function f() {
return 1
}
console.log( f() )
function f() {
return 2
}
console.log( f() )
function f() {
return 1
}
function f() {
return 2
}
var f = function() {
return 1
}
console.log( f() )
var f = function() {
return 2
}
console.log( f() )
var f = function() {
return 1
}
var f = function() {
return 2
}
2 2 1
(поднимается только var f)
Uncaught TypeError:
f is not a function
Уверен, Вы так и подумали
0.2 + 0.7 == 0.9 // false: 0,2+0,7 = 0.8999999999999999
0.1 + 0.2 == 0.3 // false: 0,1+0,2 = 0.30000000000000004
0.2+0.7 + 0.1+0.2 == 0.9+0.3 // true
10000000000000000 == 10000000000000001 // true
10000000000000000 == 10000000000000002 // false
1e400 == 1e500 // true: Infinity == Infinity
Math.log(-1) == Math.log(-1) // false: NaN
Математика – царица наук! Вы уже в курсе…
JavaScript прекрасен!
Но будьте с ним осторожны…
Contacts
https://itstep.org/
+38 (048) 728-66-60
+38 (067) 557 87 05
+38 (0512) 67 00 53
+38 (050) 443 61 00

More Related Content

What's hot (20)

Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage Collector
Olexandra Dmytrenko
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10
Dima Dzuba
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Dima Dzuba
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Sergey Platonov
 
Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8.
Dima Dzuba
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
Sergey Platonov
 
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языка
Alexander Kucherenko
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Python Meetup
 
Язык программирования C#
Язык программирования C#Язык программирования C#
Язык программирования C#
Dmitri Soshnikov
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
Sergey Platonov
 
C++ Базовый. Занятие 05.
C++ Базовый. Занятие 05.C++ Базовый. Занятие 05.
C++ Базовый. Занятие 05.
Igor Shkulipa
 
Иван Иноземцев — Fantom
Иван Иноземцев — FantomИван Иноземцев — Fantom
Иван Иноземцев — Fantom
Yury Yurevich
 
Web весна 2013 лекция 9
Web весна 2013 лекция 9Web весна 2013 лекция 9
Web весна 2013 лекция 9
Technopark
 
Authemployee
AuthemployeeAuthemployee
Authemployee
Tatiana rey
 
Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.
Roman Brovko
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6
Dima Dzuba
 
Javascript 1
Javascript 1Javascript 1
Javascript 1
Andrey Dolinin
 
Лекция 6. Классы 1.
Лекция 6. Классы 1.Лекция 6. Классы 1.
Лекция 6. Классы 1.
Roman Brovko
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Sergey Platonov
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage Collector
Olexandra Dmytrenko
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10
Dima Dzuba
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Dima Dzuba
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Sergey Platonov
 
Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8.
Dima Dzuba
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
Sergey Platonov
 
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языка
Alexander Kucherenko
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Python Meetup
 
Язык программирования C#
Язык программирования C#Язык программирования C#
Язык программирования C#
Dmitri Soshnikov
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
Sergey Platonov
 
C++ Базовый. Занятие 05.
C++ Базовый. Занятие 05.C++ Базовый. Занятие 05.
C++ Базовый. Занятие 05.
Igor Shkulipa
 
Иван Иноземцев — Fantom
Иван Иноземцев — FantomИван Иноземцев — Fantom
Иван Иноземцев — Fantom
Yury Yurevich
 
Web весна 2013 лекция 9
Web весна 2013 лекция 9Web весна 2013 лекция 9
Web весна 2013 лекция 9
Technopark
 
Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.
Roman Brovko
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6
Dima Dzuba
 
Лекция 6. Классы 1.
Лекция 6. Классы 1.Лекция 6. Классы 1.
Лекция 6. Классы 1.
Roman Brovko
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Sergey Platonov
 

Similar to Denys Samoylenko ''JS learning lifehacks: common programmer's mistake'' (20)

Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связность
Andrey Bibichev
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)
Dmitry Stropalov
 
Scala on android
Scala on androidScala on android
Scala on android
Valeriya Atamanova
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
Alex Ott
 
Android: Как написать приложение, которое не тормозит
Android: Как  написать приложение, которое не тормозитAndroid: Как  написать приложение, которое не тормозит
Android: Как написать приложение, которое не тормозит
Elena Kotina
 
Внутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpackВнутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpack
Alexey Ivanov
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013
ScalaNsk
 
Систематизация экспрешнов в IE
Систематизация экспрешнов в IEСистематизация экспрешнов в IE
Систематизация экспрешнов в IE
Roman Komarov
 
C# Deep Dive
C# Deep DiveC# Deep Dive
C# Deep Dive
LuxoftTraining
 
#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентов#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентов
Nikolay Samokhvalov
 
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов НиколайnoBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
Ontico
 
Web весна 2012 лекция 9
Web весна 2012 лекция 9Web весна 2012 лекция 9
Web весна 2012 лекция 9
Technopark
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
Vasil Remeniuk
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
Alex Tumanoff
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Yandex
 
PHP7 - что ожидать?
PHP7 - что ожидать?PHP7 - что ожидать?
PHP7 - что ожидать?
Дмитрий Золотов
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связность
Andrey Bibichev
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)
Dmitry Stropalov
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
Alex Ott
 
Android: Как написать приложение, которое не тормозит
Android: Как  написать приложение, которое не тормозитAndroid: Как  написать приложение, которое не тормозит
Android: Как написать приложение, которое не тормозит
Elena Kotina
 
Внутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpackВнутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpack
Alexey Ivanov
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013
ScalaNsk
 
Систематизация экспрешнов в IE
Систематизация экспрешнов в IEСистематизация экспрешнов в IE
Систематизация экспрешнов в IE
Roman Komarov
 
#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентов#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентов
Nikolay Samokhvalov
 
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов НиколайnoBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
Ontico
 
Web весна 2012 лекция 9
Web весна 2012 лекция 9Web весна 2012 лекция 9
Web весна 2012 лекция 9
Technopark
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
Vasil Remeniuk
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
Alex Tumanoff
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Yandex
 

More from OdessaJS Conf (20)

'GraphQL Schema Design' by Borys Mohyla. OdessaJS'2021
'GraphQL Schema Design' by Borys Mohyla. OdessaJS'2021'GraphQL Schema Design' by Borys Mohyla. OdessaJS'2021
'GraphQL Schema Design' by Borys Mohyla. OdessaJS'2021
OdessaJS Conf
 
'How i came up with my talk' by Yurii Artiukh. OdessaJS'2021
'How i came up with my talk' by Yurii Artiukh. OdessaJS'2021'How i came up with my talk' by Yurii Artiukh. OdessaJS'2021
'How i came up with my talk' by Yurii Artiukh. OdessaJS'2021
OdessaJS Conf
 
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
OdessaJS Conf
 
Олексій Павленко. CONTRACT PROTECTION ON THE FRONTEND SIDE: HOW TO ORGANIZE R...
Олексій Павленко. CONTRACT PROTECTION ON THE FRONTEND SIDE: HOW TO ORGANIZE R...Олексій Павленко. CONTRACT PROTECTION ON THE FRONTEND SIDE: HOW TO ORGANIZE R...
Олексій Павленко. CONTRACT PROTECTION ON THE FRONTEND SIDE: HOW TO ORGANIZE R...
OdessaJS Conf
 
Андрій Троян. Розробка мікросервісів з NestJS. OdessaJS'2021
Андрій Троян. Розробка мікросервісів з NestJS. OdessaJS'2021Андрій Троян. Розробка мікросервісів з NestJS. OdessaJS'2021
Андрій Троян. Розробка мікросервісів з NestJS. OdessaJS'2021
OdessaJS Conf
 
Олексій Гончар "Використання Electron в розробці корпоративної відео-мессeндж...
Олексій Гончар "Використання Electron в розробці корпоративної відео-мессeндж...Олексій Гончар "Використання Electron в розробці корпоративної відео-мессeндж...
Олексій Гончар "Використання Electron в розробці корпоративної відео-мессeндж...
OdessaJS Conf
 
Максим Климишин "Що такого особливого у пропозиції вартості шаблону Micro Fro...
Максим Климишин "Що такого особливого у пропозиції вартості шаблону Micro Fro...Максим Климишин "Що такого особливого у пропозиції вартості шаблону Micro Fro...
Максим Климишин "Що такого особливого у пропозиції вартості шаблону Micro Fro...
OdessaJS Conf
 
Павло Галушко. GOOD CODE MYTHS. OdessaJS'2021
Павло Галушко. GOOD CODE MYTHS. OdessaJS'2021Павло Галушко. GOOD CODE MYTHS. OdessaJS'2021
Павло Галушко. GOOD CODE MYTHS. OdessaJS'2021
OdessaJS Conf
 
"NODEJS & GRAPHQL COOKBOOK. LET’S TALK ABOUT MICRO-SERVICES" by Антон Чередні...
"NODEJS & GRAPHQL COOKBOOK. LET’S TALK ABOUT MICRO-SERVICES" by Антон Чередні..."NODEJS & GRAPHQL COOKBOOK. LET’S TALK ABOUT MICRO-SERVICES" by Антон Чередні...
"NODEJS & GRAPHQL COOKBOOK. LET’S TALK ABOUT MICRO-SERVICES" by Антон Чередні...
OdessaJS Conf
 
'BUILDING ANGULAR APPS WITH NX' by Anastasia Necheporenko
'BUILDING ANGULAR APPS WITH NX' by Anastasia Necheporenko'BUILDING ANGULAR APPS WITH NX' by Anastasia Necheporenko
'BUILDING ANGULAR APPS WITH NX' by Anastasia Necheporenko
OdessaJS Conf
 
'IS THERE JAVASCRIPT ON SWAGGER PLUGINS?' by Dmytro Gusev
'IS THERE JAVASCRIPT ON SWAGGER PLUGINS?' by  Dmytro Gusev'IS THERE JAVASCRIPT ON SWAGGER PLUGINS?' by  Dmytro Gusev
'IS THERE JAVASCRIPT ON SWAGGER PLUGINS?' by Dmytro Gusev
OdessaJS Conf
 
'ETHEREUM SMART CONTRACTS ON JS' by Yaroslav Dvorovenko
'ETHEREUM SMART CONTRACTS ON JS' by Yaroslav Dvorovenko'ETHEREUM SMART CONTRACTS ON JS' by Yaroslav Dvorovenko
'ETHEREUM SMART CONTRACTS ON JS' by Yaroslav Dvorovenko
OdessaJS Conf
 
'GOLANG USAGE IN DEVELOPMENT OF NODE.JS APPLICATIONS (NODE.JS: IN GO WE TRUST...
'GOLANG USAGE IN DEVELOPMENT OF NODE.JS APPLICATIONS (NODE.JS: IN GO WE TRUST...'GOLANG USAGE IN DEVELOPMENT OF NODE.JS APPLICATIONS (NODE.JS: IN GO WE TRUST...
'GOLANG USAGE IN DEVELOPMENT OF NODE.JS APPLICATIONS (NODE.JS: IN GO WE TRUST...
OdessaJS Conf
 
'MICROFRONTENDS WITH REACT' by Liliia Karpenko
 'MICROFRONTENDS WITH REACT' by Liliia Karpenko 'MICROFRONTENDS WITH REACT' by Liliia Karpenko
'MICROFRONTENDS WITH REACT' by Liliia Karpenko
OdessaJS Conf
 
'Web performance metrics' BY ROMAN SAVITSKYI at OdessaJS'2020
'Web performance metrics' BY ROMAN SAVITSKYI at OdessaJS'2020'Web performance metrics' BY ROMAN SAVITSKYI at OdessaJS'2020
'Web performance metrics' BY ROMAN SAVITSKYI at OdessaJS'2020
OdessaJS Conf
 
'STORY OF ANOTHER ANIMATION' by YURII ARTYUKH at OdessaJS'2020
'STORY OF ANOTHER ANIMATION' by  YURII ARTYUKH at OdessaJS'2020'STORY OF ANOTHER ANIMATION' by  YURII ARTYUKH at OdessaJS'2020
'STORY OF ANOTHER ANIMATION' by YURII ARTYUKH at OdessaJS'2020
OdessaJS Conf
 
'JavaScript was invented in Odessa' by DMITRIY GUSEV at OdessaJS'2020
'JavaScript was invented in Odessa' by DMITRIY GUSEV at OdessaJS'2020'JavaScript was invented in Odessa' by DMITRIY GUSEV at OdessaJS'2020
'JavaScript was invented in Odessa' by DMITRIY GUSEV at OdessaJS'2020
OdessaJS Conf
 
'Why svelte' by BORYS MOHYLA at OdessaJS'2020
'Why svelte' by BORYS MOHYLA at OdessaJS'2020'Why svelte' by BORYS MOHYLA at OdessaJS'2020
'Why svelte' by BORYS MOHYLA at OdessaJS'2020
OdessaJS Conf
 
'Effective node.js development' by Viktor Turskyi at OdessaJS'2020
'Effective node.js development' by Viktor Turskyi at OdessaJS'2020'Effective node.js development' by Viktor Turskyi at OdessaJS'2020
'Effective node.js development' by Viktor Turskyi at OdessaJS'2020
OdessaJS Conf
 
'Tensorflow.js in real life' by Pavlo Galushko at OdessaJS'2020
'Tensorflow.js in real life' by Pavlo Galushko at OdessaJS'2020'Tensorflow.js in real life' by Pavlo Galushko at OdessaJS'2020
'Tensorflow.js in real life' by Pavlo Galushko at OdessaJS'2020
OdessaJS Conf
 
'GraphQL Schema Design' by Borys Mohyla. OdessaJS'2021
'GraphQL Schema Design' by Borys Mohyla. OdessaJS'2021'GraphQL Schema Design' by Borys Mohyla. OdessaJS'2021
'GraphQL Schema Design' by Borys Mohyla. OdessaJS'2021
OdessaJS Conf
 
'How i came up with my talk' by Yurii Artiukh. OdessaJS'2021
'How i came up with my talk' by Yurii Artiukh. OdessaJS'2021'How i came up with my talk' by Yurii Artiukh. OdessaJS'2021
'How i came up with my talk' by Yurii Artiukh. OdessaJS'2021
OdessaJS Conf
 
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
OdessaJS Conf
 
Олексій Павленко. CONTRACT PROTECTION ON THE FRONTEND SIDE: HOW TO ORGANIZE R...
Олексій Павленко. CONTRACT PROTECTION ON THE FRONTEND SIDE: HOW TO ORGANIZE R...Олексій Павленко. CONTRACT PROTECTION ON THE FRONTEND SIDE: HOW TO ORGANIZE R...
Олексій Павленко. CONTRACT PROTECTION ON THE FRONTEND SIDE: HOW TO ORGANIZE R...
OdessaJS Conf
 
Андрій Троян. Розробка мікросервісів з NestJS. OdessaJS'2021
Андрій Троян. Розробка мікросервісів з NestJS. OdessaJS'2021Андрій Троян. Розробка мікросервісів з NestJS. OdessaJS'2021
Андрій Троян. Розробка мікросервісів з NestJS. OdessaJS'2021
OdessaJS Conf
 
Олексій Гончар "Використання Electron в розробці корпоративної відео-мессeндж...
Олексій Гончар "Використання Electron в розробці корпоративної відео-мессeндж...Олексій Гончар "Використання Electron в розробці корпоративної відео-мессeндж...
Олексій Гончар "Використання Electron в розробці корпоративної відео-мессeндж...
OdessaJS Conf
 
Максим Климишин "Що такого особливого у пропозиції вартості шаблону Micro Fro...
Максим Климишин "Що такого особливого у пропозиції вартості шаблону Micro Fro...Максим Климишин "Що такого особливого у пропозиції вартості шаблону Micro Fro...
Максим Климишин "Що такого особливого у пропозиції вартості шаблону Micro Fro...
OdessaJS Conf
 
Павло Галушко. GOOD CODE MYTHS. OdessaJS'2021
Павло Галушко. GOOD CODE MYTHS. OdessaJS'2021Павло Галушко. GOOD CODE MYTHS. OdessaJS'2021
Павло Галушко. GOOD CODE MYTHS. OdessaJS'2021
OdessaJS Conf
 
"NODEJS & GRAPHQL COOKBOOK. LET’S TALK ABOUT MICRO-SERVICES" by Антон Чередні...
"NODEJS & GRAPHQL COOKBOOK. LET’S TALK ABOUT MICRO-SERVICES" by Антон Чередні..."NODEJS & GRAPHQL COOKBOOK. LET’S TALK ABOUT MICRO-SERVICES" by Антон Чередні...
"NODEJS & GRAPHQL COOKBOOK. LET’S TALK ABOUT MICRO-SERVICES" by Антон Чередні...
OdessaJS Conf
 
'BUILDING ANGULAR APPS WITH NX' by Anastasia Necheporenko
'BUILDING ANGULAR APPS WITH NX' by Anastasia Necheporenko'BUILDING ANGULAR APPS WITH NX' by Anastasia Necheporenko
'BUILDING ANGULAR APPS WITH NX' by Anastasia Necheporenko
OdessaJS Conf
 
'IS THERE JAVASCRIPT ON SWAGGER PLUGINS?' by Dmytro Gusev
'IS THERE JAVASCRIPT ON SWAGGER PLUGINS?' by  Dmytro Gusev'IS THERE JAVASCRIPT ON SWAGGER PLUGINS?' by  Dmytro Gusev
'IS THERE JAVASCRIPT ON SWAGGER PLUGINS?' by Dmytro Gusev
OdessaJS Conf
 
'ETHEREUM SMART CONTRACTS ON JS' by Yaroslav Dvorovenko
'ETHEREUM SMART CONTRACTS ON JS' by Yaroslav Dvorovenko'ETHEREUM SMART CONTRACTS ON JS' by Yaroslav Dvorovenko
'ETHEREUM SMART CONTRACTS ON JS' by Yaroslav Dvorovenko
OdessaJS Conf
 
'GOLANG USAGE IN DEVELOPMENT OF NODE.JS APPLICATIONS (NODE.JS: IN GO WE TRUST...
'GOLANG USAGE IN DEVELOPMENT OF NODE.JS APPLICATIONS (NODE.JS: IN GO WE TRUST...'GOLANG USAGE IN DEVELOPMENT OF NODE.JS APPLICATIONS (NODE.JS: IN GO WE TRUST...
'GOLANG USAGE IN DEVELOPMENT OF NODE.JS APPLICATIONS (NODE.JS: IN GO WE TRUST...
OdessaJS Conf
 
'MICROFRONTENDS WITH REACT' by Liliia Karpenko
 'MICROFRONTENDS WITH REACT' by Liliia Karpenko 'MICROFRONTENDS WITH REACT' by Liliia Karpenko
'MICROFRONTENDS WITH REACT' by Liliia Karpenko
OdessaJS Conf
 
'Web performance metrics' BY ROMAN SAVITSKYI at OdessaJS'2020
'Web performance metrics' BY ROMAN SAVITSKYI at OdessaJS'2020'Web performance metrics' BY ROMAN SAVITSKYI at OdessaJS'2020
'Web performance metrics' BY ROMAN SAVITSKYI at OdessaJS'2020
OdessaJS Conf
 
'STORY OF ANOTHER ANIMATION' by YURII ARTYUKH at OdessaJS'2020
'STORY OF ANOTHER ANIMATION' by  YURII ARTYUKH at OdessaJS'2020'STORY OF ANOTHER ANIMATION' by  YURII ARTYUKH at OdessaJS'2020
'STORY OF ANOTHER ANIMATION' by YURII ARTYUKH at OdessaJS'2020
OdessaJS Conf
 
'JavaScript was invented in Odessa' by DMITRIY GUSEV at OdessaJS'2020
'JavaScript was invented in Odessa' by DMITRIY GUSEV at OdessaJS'2020'JavaScript was invented in Odessa' by DMITRIY GUSEV at OdessaJS'2020
'JavaScript was invented in Odessa' by DMITRIY GUSEV at OdessaJS'2020
OdessaJS Conf
 
'Why svelte' by BORYS MOHYLA at OdessaJS'2020
'Why svelte' by BORYS MOHYLA at OdessaJS'2020'Why svelte' by BORYS MOHYLA at OdessaJS'2020
'Why svelte' by BORYS MOHYLA at OdessaJS'2020
OdessaJS Conf
 
'Effective node.js development' by Viktor Turskyi at OdessaJS'2020
'Effective node.js development' by Viktor Turskyi at OdessaJS'2020'Effective node.js development' by Viktor Turskyi at OdessaJS'2020
'Effective node.js development' by Viktor Turskyi at OdessaJS'2020
OdessaJS Conf
 
'Tensorflow.js in real life' by Pavlo Galushko at OdessaJS'2020
'Tensorflow.js in real life' by Pavlo Galushko at OdessaJS'2020'Tensorflow.js in real life' by Pavlo Galushko at OdessaJS'2020
'Tensorflow.js in real life' by Pavlo Galushko at OdessaJS'2020
OdessaJS Conf
 

Denys Samoylenko ''JS learning lifehacks: common programmer's mistake''

  • 1. Лайфхаки по изучению JS: основные ошибки, совершаемые программистами Денис Самойленко Summer. Sea. JavaScript.
  • 2. Откуда нам известны «ошибки, совершаемые программистами»?
  • 4. itstep.org Беларусь Азербайджан Грузия Болгария Румыния Мексика США Словакия Польша Молдова Швейцария Казахстан Бразилия Чехия Камбоджа Одесса Николаев Херсон Мариуполь Запорожье Кривой Рог Днепр Каменское ХарьковПолтава Киев Чернигов ЖитомирЛьвов Ивано-Франковск Черновцы Тернополь Луцк Ровно Хмельницкий Винница Тбилиси Баку Минск Бобруйск Гомель Пномпен Прага Брно Рио-де-Жанейро Астана Караганда Алматы Женева Кишинев Варшава Братислава Сиэтл 18стран 65 филиалов Тихуана Бухарест София Могилев Витебск Брест
  • 5. itstep.org 18Стран мира 1400преподавателей 45000 студентов 5000 компьютеров 300аудиторий Дмитрий Корчевский Основатель и генеральный директор Компьютерной Академии ШАГ 120000 выпускников 65 филиалов
  • 7. itstep.org Разработка программного обеспечения Компьютерная графика и дизайн Сети и кибербезопасность Программа - не имеющая аналогов по направлениям:
  • 9. JavaScript – это интерпретируемый язык: исходный код (текст программы) является и исполнимым кодом. Это позволяет легко переносить программы на различные устройства: ПК, планшеты, смартфоны, телевизоры. Мне показалось или там было «телевизоры»? Нет, не показалось, есть такой инструмент Samsung SDK специально для Samsung SmartTV Кросс-платформенный
  • 10. JavaScript — это самый быстрый из интерпретируемых языков: PHP, Ruby, Python и др. Интерпретатор для JS разрабатывался в конкурентной борьбе – «войне браузеров», тогда как другие языки – плоды спокойной работы отдельных групп разработчиков. Еще скажите, что JavaScript быстрее С++… По некоторым тестам – да. Мощь JavaScript «съедается» браузером. А вот без него, например в NodeJS, сомнения отпадают Быстрый
  • 11. Концепция Full Stack JavaScript • browser (JavaScript) • server (Node.js) • database (MongoDB) JavaScript является одним из наиболее востребованных языков на рынке вакансий IT. По данным рынка Европы JavaScript уверенно занимает первое место. Популярный
  • 13. Я знаю С/С++, С#, сам изучил Pascal Что мне стоит разобраться с JS!?
  • 14. В браузерах основное предназначение JS — манипуляции с DOM. 10 перестроек 1 перестройка Именно DOM не дает JavaScript проявить свою скорость… Особенность 1. DOM Вариант 1 Вариант 2 for( i=0; i<10; ++i ) label.innerHTML += i str = "" for(i=0; i<10; ++i) str += i label.innerHTML = str
  • 15. Переменные не нужно объявлять. Переменная создается автоматически при первом обращении на запись. Это же касается и полей в классах Тип указывать не нужно – он будет автоматически определен О чудесах динамической типизации Вы уже, наверняка, слышали Особенность 2. Динамическая типизация С / С++ / С# Pascal / Delphi JavaScript int x; x = 10; var x:integer; begin x := 10; x=10 или var x=10
  • 16. // установит красный фон для «element» element.style.backgroundColor="red" // создаст новое поле «BackgroundColor», ошибки нет element.style.BackgroundColor="red" // а эту «ошибку» я исправлял у каждого второго… $.ajax({ url: "site.html", sucsess: function(){...} }) Удобно, но…
  • 17. JavaScript получает все данные от пользователя или из НТТР-пакета в символьном (строковом) виде, даже если для этого применяются элементы числового типа. Z = X + Y // Z = 311 W = X – Y // W = -8 X.value > Y.value // true Особенность 3. HTML, HTTP: Т – значит текстовый
  • 18. С/С++ есть разница: объект - obj.field ссылка - ref->field В JavaScript создание объектов – это создание ссылок на объекты. Хотя для доступа применяется оператор «.» (точка) a = { x:10, y:20 } // а – ссылка на объект { x:10, y:20 } b = a // b – ссылка на тот же объект, что хранится в а // казалось бы, меняем значение «b» b.x = 30 // но… console.log(a) // а={x: 30, y: 20} Особенность 4. Ссылочные типы
  • 19. ООП в JavaScript на более высоком уровне, чем у С/С++ или Pascal. var f = function(){ alert( "f" ) } f() // сообщение "f" f.x = 10 // поле x объекта f f() // работает как и раньше f = 20 // новое значение f f() // ошибка: f – не функция Особенность 5. Функции – это объекты
  • 20. Параметрический полиморфизм в JavaScript отсутствует. А попроще? Функции не перегружаются А по-человечески? Функции с разными параметрами – это одна и та же функция function f(){ … } // определяем f function f(x){ … } // переопределяем f // в такой форме понятнее, почему f переопределяется f = function(){ … } f = function(x){ … } И из-за того, что функции – это объекты…
  • 21. Как думаете, какое сообщение выведет последняя строка кода? f = [] // конструктор массива for( i=0; i<3; ++i ) // заполнение массива функций f[i] = function(){ alert(i) } f[1]() // вызов функции из массива (с индексом 1) Функция хранится как текст. Обращение к «i» произойдет в момент вызова, так что i=3. Интерпретация – не компиляция… И еще о функциях – позднее связывание
  • 22. А вот тут начинается самое интересное… Традиции взяли верх – указатель «this» показывает на тот объект, которому принадлежит функция a = { name: "object a", thisLogger: function(){ console.log( this ) } } a.thisLogger() // {name: "object a", thisLogger: ƒ} Функция – объект. Значит «this» указывает на нее?
  • 23. Если функция хранится как текст, то действует ли на «this» позднее связывание? – Еще и как действует! <div id="div1" ></div> <script> div1.onclick = a.thisLogger // а – описан слайдом выше </script> Что мы увидим в консоли, когда кликнем по блоку? Правильно, ведь функция будет вызвана из блока "div1" А если добавить позднее связывание…
  • 24. Функции, как объекты, могут иметь свои поля. Для того чтобы к ним обратиться нужно… Именовать анонимные функции – все просто! f = function self( ) { // named function expression alert( self.x ) // обращение к «своему» полю х } f.x = 10 // поле х объекта f f() // сообщение – 10 Если «this» это не this, то как добраться до this?
  • 25. Вариант 1 Вариант 2 Вариант 3 <form onsubmit="handler()"> <input type="submit" value="Go" /> </form> <script> function handler(){ return false; } </script> <form id="form1"> <input type="submit" value="Go" /> </form> <script> form1.addEventListener("submit", function() { return false; } ) </script> <form id="form1"> <input type="submit" value="Go" /> </form> <script> form1.onsubmit = function() { return false; } </script> Необходимо onsubmit="return handler()" Необходимо function(e){ e.preventDefault(); … Без дополнений, все работает Простая задача - предотвратить отправку HTML-формы Особенность 6. Обработчики событий
  • 26. Все определения переменных оператором «var» и функций перемещаются (поднимаются) в начало области видимости. Особенность 7. Поднятие определений (hoisting) Мы пишем А определения поднимаются for(var i=0; i<3; ++i) console.log(i) var i for(i=0; i<3; ++i) console.log(i)
  • 27. Во-первых, это удобно. Не нужно объявлять прототипы функций до того, как они будут использованы. Функцию можно описать в любом месте – как до, так и после места первого вызова. Во-вторых, это необычно. Переменные присутствуют ДО их объявления. В-третьих, это опасно. Не запрещено написать «var х» несколько раз. А значит, можно подменить ранее описанную переменную. И что такого в этом поднятии?
  • 28. Для «var» их две – глобальная и функциональная (тело функции) console.log(i) // udefined console.log(j) // error for(var i=0; i<3; ++i) console.log(i) console.log(i) // 3 В современном стандарте введена инструкция «let i», ограничивающая область видимости текущим блоком, однако, следует помнить и о поведении инструкции «var» А где границы области видимости?
  • 29. Что мы увидим в консоли в каждом из вариантов? function f() { return 1 } console.log( f() ) function f() { return 2 } console.log( f() ) function f() { return 1 } function f() { return 2 } var f = function() { return 1 } console.log( f() ) var f = function() { return 2 } console.log( f() ) var f = function() { return 1 } var f = function() { return 2 } ? ? ? ? И где тут можно ошибиться программисту?
  • 30. Что мы увидим в консоли в каждом из вариантов? function f() { return 1 } console.log( f() ) function f() { return 2 } console.log( f() ) function f() { return 1 } function f() { return 2 } var f = function() { return 1 } console.log( f() ) var f = function() { return 2 } console.log( f() ) var f = function() { return 1 } var f = function() { return 2 } 2 2 1 (поднимается только var f) Uncaught TypeError: f is not a function Уверен, Вы так и подумали
  • 31. 0.2 + 0.7 == 0.9 // false: 0,2+0,7 = 0.8999999999999999 0.1 + 0.2 == 0.3 // false: 0,1+0,2 = 0.30000000000000004 0.2+0.7 + 0.1+0.2 == 0.9+0.3 // true 10000000000000000 == 10000000000000001 // true 10000000000000000 == 10000000000000002 // false 1e400 == 1e500 // true: Infinity == Infinity Math.log(-1) == Math.log(-1) // false: NaN Математика – царица наук! Вы уже в курсе…
  • 32. JavaScript прекрасен! Но будьте с ним осторожны…
  • 33. Contacts https://itstep.org/ +38 (048) 728-66-60 +38 (067) 557 87 05 +38 (0512) 67 00 53 +38 (050) 443 61 00