Для чого використовуютьJavaScript?
• Для попередньої перевірки введених
користувачем даних;
• Для додавання інтерактивності до веб-
сторінок:
– складні контроли (DOM, events);
– AJAX;
– реклама, спам;
JavaScript
Mocha
LiveScript
JScript – Microsoft(та ж сама історія що і з J++)
ECMAScript
JavaScript. Слово Java в назві мови не
має нічого спільного з мовою Java від Sun
Sun Netscape
Hot Java (95)
6.
Bad Parts
Мова містить“погані конструкції”, використання
яких може перетворити читання чужого коду в
справжній жах. Деякі з них ви просто змушені
використовувати, напр. оператор +
• Microsoft and
7.
Bad first implementations
•Перші реалізації мови JavaScript містили купу помилок
• Додайте до цього незліченні баги в прадавніх бравзерах, і
ви зрозумієте за що так зненавиділи JavaScript
8.
For newbie andfor guru
JavaScript одночасно є
дуже простою та дуже складною
9.
Не Java тане C#
• Не має компілятора;
• Не має строгої типізації;
• Не має поняття “клас” (тип);
• Не має класичного наслідування;
• Не має virtual чи abstract методів;
• Не має overloading методів;
…
10.
JavaScript: ключові ідеї
•“Є текст програми – виконуємо його”;
• Нестрога типізація;
• Об’єкти – динамічні контейнери;
• Прототиповане наслідування;
• Лямбда (lambda) [функції як об'єкти першого рівня];
• Зв’язування через глобальні змінні;
global
Базові типи
Примітивнітипи даних
var i = 0; // number
var s = "Hello, world"; // string
var locked = false; // boolean
var data = new Object(); // object
var f = function() { return 1; } // function
Спеціальні “значення”
null
undefined
Numbers
• Єдиний числовийтип
– Нема int, long, byte і т.д.
• Number - 64-бітне число з плаваючою
крапкою (double)
• Number “хворіє” тими ж проблемами, що і
double в C++, C# чи Java:
0.1 + 0.2 == 0.30000000000000004
• for (i = 0; i < 10; i++) {} - OK
16.
NaN
• NaN –Not a Number
• Результат помилкової арифметичної операції
<script type="text/javascript">
alert(typeof 1); // number
alert(typeof NaN); // number (!)
alert(5 - "four"); // NaN
alert(NaN == NaN); // false (!)
alert(isNaN(5 - "four")); // true
</script>
17.
String
• Стрічка єпослідовністю 16-ти бітних символів;
• Немає окремого символьного типу (char);
– Символ “емулюється” стрічкою з довжиною 1;
• Стрічки незмінні (immutable);
• Стрічковий літерал можна записати з
використанням як одинарних так і подвійних
лапок;
var s = "Hello " + 'world';
var o = s.charAt(4); // "o"
var alphasCount = s.length; // 11
null
• null –порожнє значення
var s = "something";
alert(typeof s); // string
s = null;
alert(typeof s); // object
20.
undefined
• undefined –значення, якого нема
• Це спеціальне значення дуже часто викликає
конфуз.
var s;
alert(s); // undefined
var point = new Object();
alert(point.L); // undefined
point.L = undefined;
alert(point.L); // undefined
21.
Only objects, noclasses
Всі об’єкти по своїй структурі є хеш таблицями
Dictionary<string, object>
JavaScript не має лінкера, «зв’язування» об’єктів
відбувається через спільний глобальний об’єкт
- window
Всі глобальні
об’єкти є
властивостями
об’єкта window
22.
Object as Hashtable
<scripttype="text/javascript">
var map = new Object();
map["key1"] = "JavaScript";
map["key2"] = 10;
map["key3"] = true;
var point = new Object();
point["X"] = 3;
point['Y'] = -5;
alert(map['key2'] + point['X']);
</script>
point.X || point["X"]
varpoint = new Object();
point["X"] = 3;
point.X = 3;
(!!!) наведені конструкції – еквівалентні
25.
Коли доцільно використовувати
point["X"]нотацію
– коли об'єкт створюється з метою "бути хеш-
таблицею";
– коли не відомо наперед ім'я властивості:
var propName = prompt(
"Введіть ім'я властивості");
alert(point[propName]);
– коли ім'я властивості містить недозволені символи:
var person = new Object();
person["first name"] = "Ivanov";
person["-"] = true;
person["if"] = 1234567;
Арифметичні оператори, коментарі
•Такі ж як в C++/C#/Java
• так, є ++, -- та ?:
• // однорядковий коментар
• /* багаторядковий
коментар */
WARNING: operator +
var x = 1, y = 2;
alert(x + y + "$");
alert("£" + x + y);
28.
Функції, як об'єктипершого рівня
• functions are first class objects
Дуже просте пояснення: з функціями можна
робити все те саме, що із звичайними
значеннями інших JavaScript типів (string,
object, number, boolean)
var f = "тут буде функція";
f = function() { };
var g = f;
alert(f == g); // об'єкт за посиланням
29.
f()
<script type="text/javascript">
var sum= function(a, b) {
return a + b;
}
window["a - b"] = function(a, b) {
return a - b;
}
var result1 = sum(3, 2);
var result2 = window["a - b"](3, 2);
result = window["sum"](3, 2);
</script>
30.
function f() {}
vs
varf = function () {}
<script type="text/javascript">
alert(sum(2, 2));
alert(diff(2, 2));
var sum = function(a, b) {
return a + b;
}
function diff(a, b) {
return a - b;
}
</script>
31.
Оголошення функції, щопотрібно
пам’ятати
function foo() {};
var foo = function foo() {};
var foo = undefined;
foo = function foo() {};