Web-инжиниринг

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>&ltbody><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 все-таки поддерживает полиморфизм, т.е. существуют два разных объекта с одинаковыми именами и система в них не путается.


    Содержание раздела