Синтаксис
Спецификации ECMAScript v1 и v2 предполагают использование в коде программы 7-ми битной ASCII-кодировки и использование UNICODE- символов в комментариях или строковых литералах. ECMAScript v3 позволяет использовать UNICODE в любой части программы, однако для того, чтобы исключить проблемы совместимости со старыми браузерами, этого следует избегать.
JavaScript чувствителен к регистру. Символы табуляции и перевода строк игнорируются. Однако есть одно замечание. Разделителем простых операторов является символ “;”, но не является обязательным в том случае, если операторы разделены переводом строк.
Обратите внимание на то, что следующие записи эквивалентны:
a=1;
b=3;
и
a=1
b=3
Однако запись:
return
true
является некорректной, поскольку её эквивалент:
return;
true;
Но не
return true;
Комментарии
Комментарии Javascript аналогичны языкам C и C++.
// однострочный комментарий
/* многострочный
комментарий*/
Числа
С точки зрения внутреннего представления для JavaScript все числа являются 64-х разрядными числами с плавающей точкой и описываются стандартом IEEE 754.
Все целые числа должны лежать в диапазоне от -9007199254740992 до 9007199254740992, поскольку иначе произойдёт потеря младших разрядов.
Допустимы следующие литералы:
· Десятичные целые числа (0, 234, 652345).
· Шестнадцатеричные числа (0xF 1, 0xfe340b).
· Вещественные числа ([цифры][.цифры][(Е|е)[(+|_)]цифры]).
При работе с числами доступны все традиционные арифметические операции. Кроме того, отметим, что существуют специальные константы Infinity, NaN, Number.MAX_VALUE и некоторые другие, которые могут быть использованы в арифметических операциях.
Строки
Строки являются объектами класса String.
Строковый литерал - это последовательность из нуля или более Unicode- символов, заключенная в одинарные или двойные кавычки (' или ").
Строка может содержать специальные управляющие символы такие как: \n, \b, \0, \xXX, \xXXXX и некоторые другие.
При работе со строками доступны операции конкатенации:
str = "123" + "456"
Для определения длины строки можно использовать свойство length:
str.length
Извлечение подстроки производится методом substring (первая позиция, количество). Нумерация символов - с нуля.
substr = str.substring(2,5);
Метод indexOf определяет позицию первого символа в указанной строке s:
i = str.indexOf('a');
Преобразование чисел в строку
Javascript непосредственно обеспечивает преобразование чисел в строку, если они используются при конкатенации строк.
var n = 10
str = n + " получено в результате";
str = n.toString() + " получено в результате";
Если формат вывода необходимо четко определить, могут быть использованы дополнительные методы:
var n = 123456.789;
n.toFixed(0); // "123457"
n.toFixed(2); // "123456.79"
n.toExponential(1); // "1.2e+5"
n.toExponential(3); // "1.235e+5"
n.toPrecision(4); // "1.235e+5"
n.toPrecision(7); // "123456.8"
Преобразование строк в числа
Javascript может явно преобразовать строки в числа, если это следует из контекста.
Пример:
var n = "12"*"2" // результат 24
Однако это не сработает в случае:
var n = "12" + "2" // результат "122", поскольку + является конкатенацией
Для решения этой проблемы может быть использован класс Number(), однако требование его использования заключается в том, что число должно быть обязательно десятичным.
Функции parseInt() и parseFloat() позволяют организовать разбор чисел из строки, содержащей не только цифры. Однако, если на первом месте в строке будет находиться не цифра, то возвращенный ими результат будет NaN (не число).
Функция в форме parseInt(str, base) позволяет разобрать числа в указанной base- системе счисления.
Некоторые примеры:
parseInt("3 слепых мышки"); // Вернет 3
parseFloat("3.14 метров"); // Вернет 3.14
parseInt("12.34"); // Вернет 12
parseInt("0xFF"); // Вернет 255
parseInt("11", 2); // Вернет 3 (1*2 + 1)
parseInt("ff", 16); // Вернет 255 (15*16 + 15)
parseInt("zz", 36); // Вернет 1295 (35*36 + 35)
parseInt("077", 8); // Вернет 63 (7*8 + 7)
parseInt("077", 10); // Вернет 77 (7*10 + 7)
Логические операции
Логический тип имеет значения true или false аналогично boolean в C++. Поддерживается почти аналогичный набор логических операций.
Пример:
if (a == 4)
b = b + 1;
else
a = a + 1;
Имеется дополнительный оператор тождественного сравнения = = = (троекратное =), который отличается от == (двойное =) тем, что операнды должны совпадать по типу, а неявное преобразование к ним не будет применено:
if (a === "4") // только строки!
b = b + 1;
if (a === 0) // только число 0
b = b + 1;
if (a == 0) // число 0 или пустая строка
b = b + 1;.
Имеющиеся операторы сравнения представлены в таблице 1. Для определённости примем, что предварительно выполнено присвоение x=5.
Оператор | Описание | Пример (x=5) | Результат |
Равенство | x==8 x==5 | false true | |
Равенство с учетом типа | x==="5" x===5 | false true | |
! = | Неравенство | x!=8 | true |
!== | Неравенство с учетом типа | x!=="5" x!==5 | true false |
> | Больше | x>8 | false |
< | Меньше | x<8 | true |
>= | Больше или равно | x>=8 | false |
<= | Меньше или равно | x<=8 | true |
Поддерживаются следующие выражения, позволяющие организовать ветвление процесса:
if (condition) {
…
} else {
…
}
variablename=(condition)?value1:value2
switch(n)
{
case 1:
execute code block 1
break;
case 2:
execute code block 2
break;
default:
code to be executed if n is different from case 1 and 2
}
Циклы
Выражения для формирования циклов в Javascript аналогичны C/C++ за исключением конструкции for (item in list){...}.
for (i=0; i<5; i++) {
x=x + "The number is ” + i + ”<br />”;
}
while (i<5) {
x=x + "The number is " + i + "<br />";
i++;
}
do {
x=x + "The number is " + i + "<br />";
i++;
} while (i<5);
var person={fname:"John",lname:"Doe",age:25};
for (x in person) { txt=txt + person[x]; }
Функции
Функции в Javascript задаются в форме:
function sum (a,b) // декларируем функцию sum с двумя аргументами
{
return a+b;
}
Обратите внимание на то, что возвращаемый результат не декларируется явно. Передаваемые параметры a, b не имеют типа, однако попытка передать значения неправильного типа приведут к ошибке при выполнении кода!
Существует возможность определить функциональный литерал в следующей форме:
var sum = function sum (a,b) { return a+b; };
В дальнейшем использование sum будет выглядеть аналогично явно определенной функции, однако реальную функцию в sum можно в любой момент переопределить.
Объекты
Объект - это коллекция именованных значений, которые обычно называют свойствами (properties) объекта. Важно то, что в Javascript свойства объекта могут быть добавлены при выполнении.
Пример:
var point = new Object(); // создаём пустой объект!!!
point.x = 2.3; // присоединяем свойство x
point.y = 1.2; // присоединяем свойство y
Обращение к свойствам может производиться либо в форме:
point.x
либо в форме ассоциативного массива:
point["x"]
Объектные литералы позволяют задавать значения объектов в коде. Объектные литералы могут быть простыми:
var point = { x:2.3, y:1.2 };
или вложенными:
var rectangle = {
upperLeft: { x: 2, y: 2 }, lowerRight: { x: 4, y: 4 }
};
Любой объект может быть преобразован в строку вызовом метода toString().
Массивы
Массивы, как и объекты, являются коллекциями значений, но важное отличие состоит в том, что каждый из элементов имеет номер. Нумерация элементов в Javascript начинается с нуля, как и в C. Объект-массив создается при помощи конструктора Array().
Пример массива, элементы которого произвольны:
var a = new Array();
a[0] = 1.2;
a[1] = "JavaScript";
a[2] = true;
a[3] = { x:1, y:3 };
Инициализация массива при создании:
var a = new Array(1.2, "JavaScript", true, { x:1, y:3 });
Создание массива на указанное количество элементов:
var a = new Array(10);
Литерал массива - это список разделенных запятыми значений, заключенных в квадратные скобки. Допустима инициализация массива с разнородными объектами:
var a = [1.2, "JavaScript", true, { x:1, y:3 }];
Инициализация двумерного массива:
var matrix = [[1,2,3], [4,5,6], [7,8,9]];
Инициализация массива динамически вычисленными значениями:
var base = 1024;
var table = [base, base+1, base+2, base+3];