Переменные в JavaScript

Честно сказать я с начала не хотел вводить эту тему. Что можно говорить о переменных, особенно в JavaScript? Но потом вспомнил, как иногда разбирался со сложными конструкциями и с трудом понимал некоторые, казалось бы недопустимые в других языках программирования выражения. Можно сказать так: здесь вам не будет ошибки "Неверный тип данных", а если и будет то очень редко. Если вы работали с другими языками программирования, тогда вспомните как часто у вас возникала ошибка о неверных типах данных. В языке JavaScript тип данных может с легкостью переопределяться, при этом вы можете и не заметить в каком месте, - вот в этом то и сложность. С другой стороны, если вы будете хорошо ориентироваться в принципах преобразований типов, знать все свойства переменных и массивов, эти возможности только принесут вам уверенность в написании программ.

     Переменные языка JavaScript могут хранить значения различных типов:

     Время жизни переменной связано с окном, в котором они созданы и зависит от того, где они определены. JavaScript- программы содержатся в документах HTML, и при загрузке нового документа в браузер любые переменные, созданные в программе, будут удалены.
     Чтобы сохранить какие-либо значения при загрузке нового документа в JavaScript имеются только 2 решения: Для сохранения переменных и функций с помощью фреймосодержащих документов эти переменные и функции неодходимо определить в документе верхнего уровня, а затем использовать свойства parent или top объекта window для обращения к ним из документов, загруженных в фреймы. ВАЖНО: такие переменные и функции нужно задавать в заголовке документа верхнего уровня между тегами <HEAD> . . . </HEAD>. Конечно, существует вероятность, что документ может быть загружен без фрейма и тогда обращение к неопределенному объекту вызовет ошибку, но можно предварительно проверить загружен ли документ в фрейм:

<script language="JavaScript">
<!--
if(self.parent.frames.length==0) {
document.writeln('Эта страница загружена в браузер без фрейма.');
}
//-->
</script>

     Cookies позволяют сохранять небольшие фрагменты информации на локальном диске пользователя. Устанавливая значения cookies и прореряя их на последующих стадиях работы, иожно восстанавливать необходимые значения. Более подробно о cookies будем говорить позже.

Имена переменных, создание переменных

     В языке JavaScript создать переменную гораздо проще, чем в других языках программирования. Например, при создании переменной нет необходимости указывать ее тип. Переменные определяют как с начальными значениями, так и без них. В процессе выполнения программы уже созданные переменные можно даже приводить к различным типам данных. Имена переменных могут начинаться с любой буквы (от a до z, или A-Z ) либо с символа подчеркивания (_), оставшаяся часть может содержать цифры, символы подчеркивания и буквы. Помните то, что в именах переменных различаются символы верхнего и нижнего регистра: например MyVariable - это не то же что myvariable.
     Переменную можно создать одним из способов:      Оператор Var используют не только для создания переменной, но и для ее инициализации. Операция присваивания (=) необходима, чтобы запомнить в переменной значение, и при работе с переменными, созданными без начального значения, ее использовать не обязательно. Например:

var MyVariable = 35

создает переменную с именем MyVariable, содержащую числовое значение 35. Переменная существует до тех пор, пока загружен текущий документ. Если вы создаете эту переменную во фреймосодержащем документе верхнего уровня, к ней следует обращаться с помощью выражения top.MyVariable, а еще лучше parent.MyVariable для подстраховки от вложенных фреймов.

     В языке JavaScript переменные можно переопределять, даже задавая другой тип данных. Например после выполнения оператора

var MyVariable = "35"

переменная будет уже хранить строку "35". Подобные преобразования-то и приводят иногда к недоразумениям. Вот например:


<script language="JavaScript">
<!--
var a = 35, b = "5", c;
c = a + b;
c = c - a;
document.writeln("C=" + c);
//-->
</script>

как вы думаете какое значение примет переменная "c" после выполнения программы? Если вы не знакомы с правилами преобразования переменных в JavaScript - не угадаете. Значение переменной "c" после завершения блока будет равным числовому значению 320. О принципах преобразования типов переменных будем говорить позже. Переменную можно определить и не используя оператор "Var", а просто достаточно присвоить значение, причем каков тип данных будет присвоен, того типа и окажется переменная. Оператор "Var" используется по большей части для читабельности JS-программы. Переменная может быть задана и без начальных значений, например:

var MyVariable;

создана переменная с именем MyVariable, не имеющая определенного типа данных и начального значения. Переменные, создаваемые при помощи таких описаний, известны как неопределенные (null variable). Например сравнивая такую переменную со значением null, можно узнать, определена ли переменная. Однако нельзя путать разные вещи: ""- пустая строка это строковый тип и вовсе не null-значение.

     Тип переменной может быть установлен в любом месте JS-программы в отличие от других языков программирования, что дает дополнительную гибкость, но и возможность запутаться - помните это. К переменной, которая не создана, обратиться невозможно. Если нужно создать временную переменную, например счетчик цикла, нужно записать перед ней префикс var:
for (var i=0; i<= document.links.length; i++) {
. . . . .
}
в данном примере инициализируется переменная i, и затем используется в качестве счетчика оператора for.
     Переменные, определенные с помощью var, разделяются запятой. Для большей читабельности JS-программы каждую переменную записывают обычно с новой строки.

Строковые переменные

     Строка представляет собой множество символов, заключенных в одинарные или двойные кавычки. Строки в JavaScript рассматриваются как объекты. Это практически самый распространенный вид объектов, поэтому в JavaScript имеется множество стандартных функций, предназначенных для управления строками. Создать объект String можно одним из нескольких способов: Самым простым и наиболее распространенным способом создания объекта String является использование таких операторов, как

var myVariable = "Хорошее пиво";

Приведенный оператор присваивает строку "Хорошее пиво" строковой переменной myVariable. Переменная myVariable рассматривается как строковый объект и может использовать любой из стандартных методов объекта String языка JavaScript. Оператор Var можно пропустить, как и говорилось ранее он нужен в основном для читабельности программы.

     Для создания строковых объектов допускается использовать конструктор String() с оператором new. В действительности объект String не относится к языку JavaScript, а является встроенным объектом браузера главным образом потому, что строки создаются тогда, когда пользователь в них нуждается. Рассмотрим пример:

var myVariable = new String();

Этот оператор создает новый объект - пустую строку с именем myVariable. Изначально это пустая строка (""), а значение свойства myVariable.length равное 0.

     Конструктор String() допускает передачу заданной строки в виде аргумента:

var myVariable = new String("Правильное пиво");

     Строковый объект может содержать специальные символы, управляющие форматированием строк:

эти символы будут правильно интерпретированы только в контейнерах <textarea> и в методах "Alert". Форматирование же для document.write() осуществяется другими методами или тегами HTML.
     Объект String имеет только одно свойство - length, значением которого является количество символов в строке, содержащейся в объекте. Методы объекта String можно разделить на две категории:      Методы форматирования документа применяются для вывода строк в документ, а методы управления строками - для проверки и изменения содержимого объекта String.
Приведем перечень методов: (буква Ф - методы форматирования, а буква У - управления строками)

Метод
Описание
anchor()УСоздает именованную метку, т.е. тег <a name> из содержимого объекта
big()ФЗаключает строку в контейнер <big> . . . </big>, для отображения крупным шрифтом
blink()ФЗаключает строку в контейнер <blink> . . . </blink>, чтобы она отображалась мигающей.
bold()ФЗаключает строку в контейнер <b> . . . </b>, чтобы она отображалась жирным шрифтом.
charAt()УВозвращает символ, находящийся в заданной позиции строки
fixsed()ФЗаключает строку в контейнер <tt> . . . </tt>, чтобы она отображалась шрифтом постоянной ширины.
fontcolor()ФЗаключает строку в контейнер <font color=colorCode> . . . </font>, чтобы она отображалась определенным цветом.
fontsize()ФЗаключает строку в контейнер <font size=fontSize> . . . </font>, чтобы она отображалась шрифтом определенного размера.
IndexOf()УВозвращает индекс первого заданного символа, найденного в строке.
italics()ФЗаключает строку в контейнер <i> . . . </i>, чтобы она отображалась курсивом.
lastIndexOf()УВозвращает индекс последнего заданного символа, найденного в строке.
link()УСоздает тег гиперсвязи <a href> . . . </a> и помещает в него содержимое объекта
small()ФЗаключает строку в тег <small> . . . </small>, чтобы она отображалась шрифтом меньшего размера.
strike()ФЗаключает строку в контейнер <strike> . . . </strike>, чтобы она отображалась зачеркнутой.
sub()ФЗаключает строку в контейнер <sub> . . . </sub>, чтобы она отображалась как нижний индекс.
substring()УВозвращает подстроку текстовой строки.
sup()ФЗаключает строку в контейнер <sup> . . . </sup>, чтобы она отображалась как верхний индекс.
toLowerCase()УПреобразует все буквы строки в строчные
toUpperCase()УПреобразует все буквы строки в прописные


Числовые переменные

     Числовые значения могут быть либо целыми, либо числами с плавающей точкой. Числа с плавающей точкой называют действительными или вещественными. К числовым значениям применимы операции: Кроме того, используют операции умножения, деления, сложения и вычитания в сочетании с присваиванием (*=, /=, +=, -=), а также методы объекта Math.

Булевы переменные

     Булевы, или логические, переменные содержат только литеральные значкения - true и false - и используются в логических выражениях и операторах.
     Для проверки значения булевой переменной используют и операцию логического равенства:
booleanVar == true
хотя в данном случае такая операция проверки излишняя. Для проверки значений, которые не являются истинными, используют знак логического отрицания (!). Например, выражение !booleanVar возвратит значение true, если значение booleanVar равно false. Вместо слов "true" и "false" можно использовать числовые значения "1" и "2", поскольку именно такбулевы значения представлены в памяти компьютера: 1==true и 0==false.

Переменные-массивы

     Переменные-массивы содержат упорядоченные наборы значений одного типа, для удобства представленные в виде одной переменной. Многие стандартные объекты-свойства документа в языке JavaScript, в частности гиперсвязи и метки, являются массивами. В языке JavaScript к элементу массива следует обращаться при помощи выражения:

arrayName[index]

где arrayName - имя массива, а index - числовая переменная или число, задающее позицию элемента в массиве. Например, arrayName[0] является первым элементом этого массива. Индексы элементов массива в языке JavaScript начинаются с нуля. Элементы массива могут быть любого типа, например строками или булевыми переменными. Кроме того, при определенных условиях массив может содержать элементы различных типов данных. В языке JavaScript массивы создаются при помощи:      С помощью конструктора Array() не только создают объект array, но и присваивают начальные значения его элементам. Существует возможность добавлять элементы в массивдинамически - путем присваивания определенных значений элементам массива. Допускается также "пропускать" элементы массива и задавать их в любой последовательности. Для создания нового экземпляра объекта array конструктор Array() необходимо использовать с оператором new. Например, в седующем примере создается массив с именем arrayImg, содержащий два элемента, каждый из которых является объектом String

var path = "c:/images/" ,
arrayImg = new Array();
arrayImg[0] = path+"img1.gif";
arrayImg[1] = path+"img2.gif";

     При использовании конструктора Array() значение свойства length устанавливается автоматически. Поэтому после инициализации элементов массива в приведенном примере выражение arrayImg.length возвращает значение 2. Элементы массива также могут быть заданы как параметры конструктора:

var path = "c:/images/" ,
arrayImg = new Array(path+"img1.gif", path+"img2.gif");

Данное выражение представляет собой сокращенную запись предыдущего примера.
     В языке JavaScript можно создавать массив, это массив в котором элементы имеют различный тип данных:

var myArray = new Array(3.14, true, 85, date(), "word");

создает массив, элемент myArray[0] которого является числом с плавающей запятой, элемент myArray[1] - булевым значением, элемент myArray[3] - объектом Date.
     Размер массива и, следовательно, значение свойства length объекта, создаваемого конструктором Array(), зависят от максимального значения индекса, который применялся для задания элемента массива. Например:

var myArray = new Array;
myArray[20] = "Это 21 элемент массива";

двадцать первому элементу массива присваивается строковое значение "Это 21 элемент массива", а значение свойства myArray.length равно 21 независимо от того имеют ли значения элементы массива с индексом меньше 20.
     Значение свойства length объекта Array автоматически устанавливается при явном указании количества элементов в конструкторе Array():

myArray = new Array(10);

оператор создает массив из 10-ти элементов от 0 до 9. Значение свойства length массива нельзя установить путем присваивания, так как length является свойством только для чтения. Например, чтобы задать значение 10 для свойства length нужно только определить значение последнего, в данном случае 9-го элемента массива:

myArray = new Array();
myArray[9] = 0;

     Кроме того, существует возможность задать значения элементов массива при его конструировании :

myArray = new Array(0,0,0,0,0,0);

Конструктор Object()

     Понятия объект и массив равнозначны, хотя конструкторы Object() и Array() работают по-разному. Конструктору Object() невозможно передать несколько элементов массива, поэтому такое выражение
var myObj = new Object(value1, value2);
работать не будет. Массивы, создаваемые при помощи конструктора Object(), не имеют свойства length. Поэтому, создавая массив таким способом, следует либо организовывать обход этого массива посредством цикла for и подсчитать элементы массива, либо жестко задать длину массива как значение его первого элемента (обычно так поступают моделируя свойство length), а затем обращаться к нему по мере необходимости для проверки размера массива, увеличение значения при добавлении нового элемента, а также в качестве параметра цикла при циклическом считывании или изменения значений элементов. Такой объект часто бывает неприемлем для случаев, когда содержимое массива должно динамически изменяться, поэтому в большинстве случаев пользуются конструктором Array(). Значения индексов массивов, создаваемых в конструкторе Object(), также начинаются с нуля. Для создания массива при помощи конструктора Object() принято использовать запись вида:

var myObj = new Object();
myObj[0] = 2; // задаем размерность массива
myObj[1] = "Первый элемент";
myObj[2] = "Второй элемент";

     Чтобы узнать размер массива, созданного подобным образом, необходимо обратиться к элементу myObj[0]. Значением свойства myObj.length является null, так, как значение не определено.

Преобразование строк и чисел

     Наконец подошли к самой интересной теме. Дело в том, что в языке JavaScript в отличие от других языков нет функций типа Val() и Str(). Однажды я видел программку на языке JavaScript, автора не буду называть, где при помощи всевозможных преобразований типов данных была попытка запутать программу для "непродвинутых" пользователей. Так вот, нужно запомнить два правила: