Data
Типы и структуры данных
Как и любой другой язык программирования JavaScript поддерживает встроенные типы и структуры данных. Все их многообразие можно подразделить на:
При этом все они делятся на встроенные и определяемые программистом. Функции и объекты рассматриваются в разделах "Функции" и "Объекты". Поэтому здесь мы сосредоточимся на литералах, переменных и массивах.
Литералы
Литералом называют данные, которые используются в программе непосредственно. При этом под данными понимаются числа или строки текста. Все они рассматриваются в JavaScript как элементарные типы данных. Приведем примеры литералов:
числовой литерал: 10
числовой литерал: 2.310
числовой литерал: 2.3e+2
строковый литерал: 'Это строковый литерал'
строковый литерал: "Это строковый литерал"
Литералы используются в операциях присваивания значений переменным или операциях сравнения:
var a=10;
var str = 'Hy!!!';
if(x=='kuku') window.alert(x);
Два варианта строковых литералов необходимы для того, чтобы использовать вложенные строковые литералы. Вообще говоря, есть подозрение, что равноправие "..." и '...' мнимое. Если внимательно посмотреть на реализацию страниц программирования гипертекстовых ссылок(href.htm,path.htm и mouse.htm), то нетрудно заметить, что вместо прямого переназначения гипертекстовой ссылки литералом типа '...' там используется косвенное переназначение через функцию литералом "...":
...
function line(a)
{
...
window.document.main.document.links[4].href=
"javascript:data(0);void(0);";
...
}
...
<a href="javascript:line(0);void(0);">
<img src=../images/jsi/addrpho.gif border=0>
</a>
вместо:
<a
href="javascript:
window.document.main.document.links[4].href=
'javascript:data(0);void(0);';void(0);">
<img src=../images/jsi/addrpho.gif border=0>
</a>
Это связано с особенностями реализации Netscape. Дело в том, что прямое переназначение неправильно отображает кириллицу в win32, а вот косвенное работает. Похоже, что "..." разрешает анализ информации внутри строкового литерала JavaScript-интерпретатором, а '...' - нет.
Если быть более точным, то следует сказать, что строка - это объект. У этого объекта существует великое множество методов. Строчный литерал и строчный объект - это далеко не одно и тоже. При применении к строчным литералам методов строчных объектов происходит преобразование первых в последние.
начало страницы
Переменные
Переменные в JavaScript могут быть определены назначением или при помощи оператора var:
i=10;
var i;
var i=10;
var id = window.open();
var a = new Array();
Как видно из примеров, переменные могут принимать самые разные значения, при этом тип переменной определяется контекстом.
Переменная является свойством окна. Например, мы можем открыть окно, определить в нем новую переменную и использовать ее:
wid = window.open("","kuku","width=200,height=100,statusbar");
wid.document.open();
wid.document.write("<html><head>");
wid.document.write("<script>var t;</script>");
wid.document.write("</head><body>");
wid.document.write("<center>Новое окно<br>");
wid.document.write("<form>");
wid.document.write("<input type=button value='Закрыть окно' onClick=window.close();></form>");
wid.document.write("</center></body<>/html>");
wid.document.close();
...
<a href="javascript:wid.t=window.prompt("Type new status value:");wid.defaultStatus=t;wid.focus();void(0);>...</a>
Существуют ли в JavaScript различные типы переменных? По всей видимости, да. При объявлении переменной тип не указывается. Тип значения определяется контекстом. Поэтому существует соблазн предположить, что все переменные одного и того же типа. Однако очевидно, что присваивание переменной значения объекта окна (window.open())или объекта потока(setTimeout()), порождает создание совершенно разных структур в памяти.
Поставим вопрос несколько иначе. Может ли одна и та же переменная принимать значения разных типов? Для ответа на этот вопрос рассмотрим следующий пример:
var flag=0;
var cid=null;
function clock()
{
flag=1;
d = new Date();
window.document.main.document.f0.fi1.value=
d.getHours()+":"+d.getMinutes()+":"+d.getSeconds();
cid = setTimeout("clock();",100);
}
function stop()
{
if(cid!=null)
{
clearTimeout(cid);
cid=null;
flag=0;
}
}
function wo()
{
cid = window.open("","kuku","width=400,height=100");
cid.document.open();
cid.document.write("<html><head></head><body><center>");
cid.document.write("<form><input type=button onClick='window.close();' value='Закрыть окно'></form></center>");
cid.document.write("</body></html>");
cid.document.close();
cid.focus();
}
...
<form name=f0>
<input name=fi1 size=8 maxlength=8>
<input type=button value="Часы(start/stop)" onClick="if(flag==0)clock();else stop();">
<input type=button value="Окно" onClick="wo();">
</form>
Вы можете в любом порядке нажимать на кнопки формы, и все будет работать правильно. При этом переменная cid используется и как идентификатор потока и как идентификатор окна. Это означает, что JavaScript все-таки поддерживает полиморфизм, т.е. существуют два разных объекта с одинаковыми именами и система в них не путается.